Cómo eliminar un elemento de una matriz en C #

Digamos que tengo esta matriz,

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

¿Cómo puedo eliminar un elemento por “nombre”? , digamos el número 4?

Incluso ArrayList no ayudó a eliminar?

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

Si desea eliminar todas las instancias de 4 sin necesidad de conocer el índice:

LINQ: (.NET Framework 3.5)

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

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

Si desea eliminar solo la primera instancia:

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

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

Editar: en caso de que aún no lo hayas descifrado, como Malfist señaló, debes apuntar a .NET Framework 3.5 para que los ejemplos del código LINQ funcionen. Si está orientando 2.0, necesita hacer referencia a los ejemplos que no son LINQ.

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

También puede convertir su matriz en una lista y llamar a eliminar en la lista. A continuación, puede convertir de nuevo a su matriz.

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

El código que está escrito en la pregunta tiene un error

Su lista de arrays contiene cadenas de “1” “3” “4” “9” y “2” (tenga en cuenta los espacios)

Entonces IndexOf (4) no encontrará nada porque 4 es un int, e incluso “tostring” lo convertiría en “4” y no “4”, y no se eliminará nada.

Una lista de arrays es la forma correcta de hacer lo que quiere.

La respuesta de Balabaster es correcta si desea eliminar todas las instancias del elemento. Si quieres eliminar solo el primero, harías algo como esto:

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

Eliminar una matriz en sí no es simple, ya que tendrás que lidiar con el cambio de tamaño. Esta es una de las grandes ventajas de usar algo así como una List . Proporciona Remove / RemoveAt en 2.0 y muchas extensiones LINQ para 3.0.

Si puede, vuelva a configurar para usar una List<> o similar.

Publiqué mi solución aquí .

Esta es una forma de eliminar un elemento de matriz sin copiar a otra matriz, solo en el marco de la misma instancia de matriz:

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

Como una extensión genérica, compatible 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); 

Para eliminar elementos de la cadena en función de los valores de clave del diccionario. ‘Código de 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() 

Puedes hacerlo de esta manera:

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