Eliminar elemento de una matriz regular

Resuelto leora asked hace 15 años • 16 respuestas

Tengo una variedad de objetos Foo. ¿Cómo elimino el segundo elemento de la matriz?

Necesito algo similar RemoveAt()pero para una matriz normal.

leora avatar Jan 19 '09 19:01 leora
Aceptado

Si no desea utilizar Lista:

var foos = new List<Foo>(array);
foos.RemoveAt(index);
return foos.ToArray();

Podrías probar este método de extensión que en realidad no he probado:

public static T[] RemoveAt<T>(this T[] source, int index)
{
    T[] dest = new T[source.Length - 1];
    if( index > 0 )
        Array.Copy(source, 0, dest, 0, index);

    if( index < source.Length - 1 )
        Array.Copy(source, index + 1, dest, index, source.Length - index - 1);

    return dest;
}

Y úsalo como:

Foo[] bar = GetFoos();
bar = bar.RemoveAt(2);
Andrew Kennan avatar Jan 19 '2009 12:01 Andrew Kennan

La naturaleza de las matrices es que su longitud es inmutable. No puede agregar ni eliminar ninguno de los elementos de la matriz.

Tendrá que crear una nueva matriz que sea un elemento más corta y copiar los elementos antiguos a la nueva matriz, excluyendo el elemento que desea eliminar.

Por lo que probablemente sea mejor utilizar una lista en lugar de una matriz.

Sebastian Dietz avatar Jan 19 '2009 12:01 Sebastian Dietz

Utilizo este método para eliminar un elemento de una matriz de objetos. En mi situación, mis matrices son pequeñas. Entonces, si tiene matrices grandes, es posible que necesite otra solución.

private int[] RemoveIndices(int[] IndicesArray, int RemoveAt)
{
    int[] newIndicesArray = new int[IndicesArray.Length - 1];

    int i = 0;
    int j = 0;
    while (i < IndicesArray.Length)
    {
        if (i != RemoveAt)
        {
            newIndicesArray[j] = IndicesArray[i];
            j++;
        }

        i++;
    }

    return newIndicesArray;
}
EdHellyer avatar Dec 12 '2010 18:12 EdHellyer

Solución LINQ de una línea:

myArray = myArray.Where((source, index) => index != 1).ToArray();

En 1ese ejemplo, es el índice del elemento que se va a eliminar; en este ejemplo, según la pregunta original, el segundo elemento (siendo 1el segundo elemento en la indexación de matrices de base cero de C#).

Un ejemplo más completo:

string[] myArray = { "a", "b", "c", "d", "e" };
int indexToRemove = 1;
myArray = myArray.Where((source, index) => index != indexToRemove).ToArray();

Después de ejecutar ese fragmento, el valor de myArrayserá { "a", "c", "d", "e" }.

Jon Schneider avatar Sep 11 '2014 18:09 Jon Schneider