Come eliminare un elemento da una matrice in C #

Diciamo che ho questo array,

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

Come posso cancellare un elemento con “nome”? , diciamo numero 4?

Anche ArrayList non ha aiutato a cancellare?

 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); } 

Se vuoi rimuovere tutte le istanze di 4 senza aver bisogno di conoscere l’indice:

LINQ: (.NET Framework 3.5)

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

Non 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(); 

Se si desidera rimuovere solo la prima istanza:

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(); 

Non LINQ: (.NET Framework 2.0)

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

Modifica: nel caso in cui non lo avessi già capito, come ha sottolineato Malfist, devi mirare a .NET Framework 3.5 affinché gli esempi di codice LINQ funzionino. Se stai pensando a 2.0, devi fare riferimento agli esempi Non-LINQ.

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

È inoltre ansible convertire la matrice in un elenco e chiamare rimuovere nell’elenco. È quindi ansible riconvertire in array.

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

Il codice che è scritto nella domanda ha un bug in esso

Il tuo arraylist contiene stringhe di “1” “3” “4” “9” e “2” (annota gli spazi)

Quindi IndexOf (4) non troverà nulla perché 4 è un int, e anche “tostring” lo convertirà in “4” e non in “4”, e nulla verrà rimosso.

Un arraylist è il modo corretto per fare ciò che vuoi.

La risposta di Balabaster è corretta se si desidera rimuovere tutte le istanze dell’elemento. Se vuoi rimuovere solo il primo, devi fare qualcosa del genere:

 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(); } 

Rimozione da una matrice stessa non è semplice, come si deve affrontare il ridimensionamento. Questo è uno dei grandi vantaggi dell’utilizzo di qualcosa come List . Fornisce Remove / RemoveAt in 2.0 e molte estensioni LINQ per 3.0.

Se è ansible, refactoring utilizzare un List<> o simile.

Ho pubblicato la mia soluzione qui .

Questo è un modo per eliminare un elemento dell’array senza copiare su un altro array – solo nella cornice della stessa istanza dell’array:

  public static void RemoveAt(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); } 

Come estensione generica, compatibile con 2.0:

 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 (this T[] original, T itemToRemove) { int numIdx = System.Array.IndexOf(original, itemToRemove); if (numIdx == -1) return original; List tmp = new List(original); tmp.RemoveAt(numIdx); return tmp.ToArray(); } } 

Uso:

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

Per rimuovere elementi dalla stringa in base ai valori chiave del dizionario. ‘Codice VB.net

  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() 

Puoi fare in questo modo:

 int[] numbers= {1,3,4,9,2}; List lst_numbers = new List(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();