2009-01-30 16 views
116

Digamos que tengo esta matriz,Cómo eliminar un elemento de una matriz en C#

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

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

Even 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); 
} 
+0

¿Qué pasa si usted tiene valores duplicados en su lista? ¿Desea simplemente eliminar la primera instancia o todas las instancias? – BenAlabaster

+0

sí, no tengo valores duplicados, ¿alguna idea? – ahmed

+0

ahmed ¿Quiere decir, no, no, o sí? (no insulta tu inglés, solo pídeme una aclaración) – Malfist

Respuesta

276

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 sólo 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<int> tmp = new List<int>(numbers); 
tmp.RemoveAt(numIdx); 
numbers = tmp.ToArray(); 

Editar: En caso de que aún no lo han descubierto, como Malfist señaló, es necesario que se apuntan a .NET Framework 3.5 para que los ejemplos de código de LINQ para trabajar. Si está orientando 2.0, necesita hacer referencia a los ejemplos que no son LINQ.

4

La eliminación de una matriz en sí misma no es simple, ya que debe lidiar con el cambio de tamaño. Esta es una de las grandes ventajas de usar algo como un List<int> en su lugar. Proporciona Remove/RemoveAt en 2.0 y muchas extensiones LINQ para 3.0.

Si puedes, refactoriza para usar un List<> o similar.

5

La respuesta de Balabaster es correcta si desea eliminar todas las instancias del elemento. Si desea eliminar sólo el primero, que haría 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(); 
} 
8

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

Su ArrayList contiene cadenas de "1" " 3 "" 4 "" 9 "y" 2 "(tenga en cuenta los espacios)

Así que 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 quiera.

+0

La lista sería mejor que ArrayList. –

+0

Esta respuesta merece más votos positivos. Aunque estoy totalmente de acuerdo con @MikeScott en que 'List ' sería mejor que ArrayList, esta parece ser la única respuesta que identifica correctamente el problema que tenía el OP cuando intentó usar ArrayList para resolver su problema original. El OP entendió que no se puede redimensionar matrices, que nadie más parece haber notado, y trató de usar un tipo redimensionable en su lugar, que nadie más parece haber notado, y luego se tropezó con un problema diferente, que nadie más parece haber notado – phoog

20

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); 
+0

Simple y fácil. ¡Gracias! –

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

'Para eliminar elementos de la cadena basada en los valores clave de diccionario. 'VB.net código

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

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

Uso:

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

he publicado mi solución here.

Ésta es una manera de eliminar un elemento de la matriz sin necesidad de copiar a otra matriz - sólo en el marco de la misma instancia de matriz:

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

Resize realmente copia los datos a una nueva matriz (a menos que el nuevo tamaño pasado sea la longitud de la matriz pasada); no cambia el tamaño de la instancia de matriz pasada. Es por eso que es un parámetro de referencia. Vea http://referencesource.microsoft.com/mscorlib/R/71074deaf111c4e3.html. – phoog

Cuestiones relacionadas