So löschen Sie ein Element aus einem Array in C #

153

Nehmen wir an, ich habe dieses Array,

int[] numbers = {1, 3, 4, 9, 2};

Wie kann ich ein Element mit "Name" löschen? Sagen wir Nummer 4?

Auch ArrayListnicht geholfen zu löschen?

string strNumbers = " 1, 3, 4, 9, 2";
ArrayList numbers = new ArrayList(strNumbers.Split(new char[] { ',' }));
numbers.RemoveAt(numbers.IndexOf(4));
foreach (var n in numbers)
{
    Response.Write(n);
}
ahmed
quelle
Was ist, wenn Ihre Liste doppelte Werte enthält? Möchten Sie nur die erste Instanz oder alle Instanzen entfernen?
BenAlabaster
Ja, ich habe keine doppelten Werte, eine Idee?
Ahmed
ahmed Meinst du, nein, tust du nicht oder ja, tust du? (beleidigt nicht Ihr Englisch, bittet nur um Klarstellung)
Malfist
@ Malfist - sorry :), ich meinte, ich kümmere mich nicht um doppelte Werte, weil ich sicher bin, dass es keine von ihnen in meinem Fall gibt, nochmals
vielen
3
Sie können keine Elemente aus Arrays in C # entfernen, wie Sie in diesem Beispielprogramm sehen können . Sie können ein neues Array erstellen, nur einige der Elemente des ursprünglichen Arrays kopieren und es wieder der ursprünglichen Variablen zuweisen. Dies wird in allen Antworten getan.
Nicola Musatti

Antworten:

340

Wenn Sie alle Instanzen von 4 entfernen möchten, ohne den Index kennen zu müssen:

LINQ: (.NET Framework 3.5)

int[] numbers = { 1, 3, 4, 9, 2 };
int numToRemove = 4;
numbers = numbers.Where(val => val != numToRemove).ToArray();

Nicht-LINQ: (.NET Framework 2.0)

static bool isNotFour(int n)
{
    return n != 4;
}

int[] numbers = { 1, 3, 4, 9, 2 };
numbers = Array.FindAll(numbers, isNotFour).ToArray();

Wenn Sie nur die erste Instanz entfernen möchten:

LINQ: (.NET Framework 3.5)

int[] numbers = { 1, 3, 4, 9, 2, 4 };
int numToRemove = 4;
int numIndex = Array.IndexOf(numbers, numToRemove);
numbers = numbers.Where((val, idx) => idx != numIndex).ToArray();

Nicht-LINQ: (.NET Framework 2.0)

int[] numbers = { 1, 3, 4, 9, 2, 4 };
int numToRemove = 4;
int numIdx = Array.IndexOf(numbers, numToRemove);
List<int> tmp = new List<int>(numbers);
tmp.RemoveAt(numIdx);
numbers = tmp.ToArray();

Bearbeiten: Nur für den Fall, dass Sie es nicht bereits herausgefunden haben, wie Malfist betonte, müssen Sie auf .NET Framework 3.5 abzielen, damit die LINQ-Codebeispiele funktionieren. Wenn Sie auf 2.0 abzielen, müssen Sie auf die Non-LINQ-Beispiele verweisen.

BenAlabaster
quelle
32
int[] numbers = { 1, 3, 4, 9, 2 };
numbers = numbers.Except(new int[]{4}).ToArray();
meetjaydeep
quelle
21

Sie können Ihr Array auch in eine Liste konvertieren und remove in der Liste aufrufen. Sie können dann wieder in Ihr Array konvertieren.

int[] numbers = {1, 3, 4, 9, 2};
var numbersList = numbers.ToList();
numbersList.Remove(4);
Dave DP
quelle
11

Der in der Frage geschriebene Code enthält einen Fehler

Ihre Arrayliste enthält Zeichenfolgen von "1" "3" "4" "9" und "2" (beachten Sie die Leerzeichen)

IndexOf (4) findet also nichts, weil 4 ein int ist, und sogar "tostring" würde es in "4" und nicht in "4" konvertieren, und nichts wird entfernt.

Eine Arrayliste ist der richtige Weg, um das zu tun, was Sie wollen.

DevinB
quelle
List <T> wäre besser als ArrayList.
Mike Scott
1
Diese Antwort verdient mehr positive Stimmen. Obwohl ich @MikeScott absolut zustimme, dass List<T>dies besser als ArrayList wäre, scheint dies die einzige Antwort zu sein, die das Problem, das das OP hatte, als er versuchte, ArrayList zur Lösung seines ursprünglichen Problems zu verwenden, korrekt identifiziert. Das OP hat verstanden, dass Sie die Größe von Arrays nicht ändern können, was anscheinend niemand anderes bemerkt hat, und versucht, stattdessen einen veränderbaren Typ zu verwenden, den anscheinend niemand anderes bemerkt hat, und ist dann auf ein anderes Problem gestoßen, das sonst niemand zu bemerken scheint bemerkt zu haben.
Phoog
5

Die Antwort von Balabaster ist richtig, wenn Sie alle Instanzen des Elements entfernen möchten. Wenn Sie nur den ersten entfernen möchten, gehen Sie folgendermaßen vor:

int[] numbers = { 1, 3, 4, 9, 2, 4 };
int numToRemove = 4;
int firstFoundIndex = Array.IndexOf(numbers, numToRemove);
if (numbers >= 0)
{
    numbers = numbers.Take(firstFoundIndex).Concat(numbers.Skip(firstFoundIndex + 1)).ToArray();
}
Vojislav Stojkovic
quelle
5

Ich habe meine Lösung hier veröffentlicht .

Auf diese Weise können Sie ein Array-Element löschen, ohne es in ein anderes Array zu kopieren - nur im Frame derselben Array-Instanz:

    public static void RemoveAt<T>(ref T[] arr, int index)
    {
        for (int a = index; a < arr.Length - 1; a++)
        {
            // moving elements downwards, to fill the gap at [index]
            arr[a] = arr[a + 1];
        }
        // finally, let's decrement Array's size by one
        Array.Resize(ref arr, arr.Length - 1);
    }
infografnet
quelle
4
Durch Größenänderung werden die Daten tatsächlich in ein neues Array kopiert (es sei denn, die übergebene neue Größe entspricht der Länge des übergebenen Arrays). Die Größe der übergebenen Array-Instanz wird nicht geändert. Deshalb ist es ein Referenzparameter. Siehe Referenzenource.microsoft.com/mscorlib/R/71074deaf111c4e3.html .
Phoog
5

Das Entfernen aus einem Array selbst ist nicht einfach, da Sie sich dann um die Größenänderung kümmern müssen. Dies ist einer der großen Vorteile der Verwendung von so etwas wie einem List<int>. Es bietet Remove/ RemoveAtin 2.0 und viele LINQ-Erweiterungen für 3.0.

Wenn Sie können, refactor, um ein List<>oder ähnliches zu verwenden.

ctacke
quelle
Ich denke, es ist die beste Lösung in diesem Fall.
Bogdan Doicin
3

Als generische Erweiterung 2.0-kompatibel:

using System.Collections.Generic;
public static class Extensions {
    //=========================================================================
    // Removes all instances of [itemToRemove] from array [original]
    // Returns the new array, without modifying [original] directly
    // .Net2.0-compatible
    public static T[] RemoveFromArray<T> (this T[] original, T itemToRemove) {  
        int numIdx = System.Array.IndexOf(original, itemToRemove);
        if (numIdx == -1) return original;
        List<T> tmp = new List<T>(original);
        tmp.RemoveAt(numIdx);
        return tmp.ToArray();
    }
}

Verwendung:

int[] numbers = {1, 3, 4, 9, 2};
numbers = numbers.RemoveFromArray(4);
Petrucio
quelle
0

' Entfernen von Elementen aus der Zeichenfolge basierend auf den Schlüsselwerten des Wörterbuchs. 'VB.net-Code

 Dim stringArr As String() = "file1,file2,file3,file4,file5,file6".Split(","c)
 Dim test As Dictionary(Of String, String) = New Dictionary(Of String, String)
 test.Add("file3", "description")
 test.Add("file5", "description")
 stringArr = stringArr.Except(test.Keys).ToArray()
SP007
quelle
0

Sie können dies folgendermaßen tun:

int[] numbers= {1,3,4,9,2};     
List<int> lst_numbers = new List<int>(numbers);
int required_number = 4;
int i = 0;
foreach (int number in lst_numbers)
{              
    if(number == required_number)
    {
        break;
    }
    i++;
}
lst_numbers.RemoveAt(i);
numbers = lst_numbers.ToArray();        

quelle