Aquí podría ser tu PUBLICIDAD


¿Hay alguna manera de tratar la matriz estática de AC # como una ArrayList?

votos
2

Tengo un código que usa Arrays y, desafortunadamente, no puedo cambiar sus tipos. Si pudiera, usaría ArrayLists o algo similar para hacer lo que tengo que hacer, pero no puedo. Básicamente, estoy buscando el mejor enfoque para agregar y eliminar objetos de una matriz estática. Para agregar un elemento a la matriz sobre la marcha, tengo que crear una nueva matriz que sea un elemento más grande que la matriz anterior, copiar los elementos de la matriz anterior en la nueva matriz y agregar el nuevo elemento. algo como esto...

public partial class dataStruct 
{
    private myObject[] myStaticArray;
};

private void AddItemToMyArray()
{
    int oldLength = dataStruct.myStaticArray.Length;
    myObject[] newMyObjectArray = new myObject[oldLength + 1];
    for (int i = 0; i < oldLength; i++)
       newMyObjectArray [i] = dataStruct.myStaticArray[i];

    dataStruct.myStaticArray[oldLength] = new myObject();
    dataStruct.myStaticArray = newMyObjectArray;
}

para eliminar un elemento, hago lo mismo, solo creo un nuevo conjunto que es un elemento más pequeño. esto se siente realmente ineficiente. ¿Alguien puede sugerir un mejor enfoque, si hay uno? o cualquier otro pensamiento?

¡Gracias de antemano por su ayuda!

Publicado el 12/03/2009 a las 16:59
fuente por usuario BeachRunnerFred
En otros idiomas...        العربية       

6 respuestas

votos
6

No, las matrices son siempre de tamaño fijo. No puede agregar / eliminar entradas de ellos.

Esta es precisamente la restricción que funciona ArrayListy List<T>funciona de manera efectiva. Mantienen una matriz internamente, pero eso generalmente es más grande que el tamaño lógico de la lista. Cuando agrega un elemento a un List<T>archivo, se rellenará el conjunto existente si es posible, o si no hay espacio suficiente, creará un nuevo conjunto más grande y copiará el contenido en él. Sin embargo, este cambio es transparente para la persona que llama: aún puede usar la referencia original porque es una referencia a la lista y no a la matriz subyacente.

Una cosa que hará que su código sea más simple (pero probablemente no más eficiente) es usar Array.Resize . No cambia el tamaño de la matriz existente , sino que devuelve una nueva matriz con una copia superficial del contenido anterior, al tamaño que solicite. La copia puede ser un poco más rápida que con un ciclo manual, pero la causa principal de la ineficiencia sigue ahí.

Respondida el 12/03/2009 a las 05:03
fuente por usuario Jon Skeet


Aquí podría ser tu PUBLICIDAD


votos
3

desafortunadamente, no puedo cambiar sus tipos

Por qué no? La única respuesta razonable es que tiene una API que debe usar con funciones que las devuelven o las requieren como parámetros. En ese caso, use List<T>y llame su .ToArray()o .AddRange()métodos según sea necesario.

Respondida el 12/03/2009 a las 05:24
fuente por usuario Joel Coehoorn

votos
3

¿Por qué quieres usar una matriz aquí? Cambie a List<T>, o (si necesita eliminaciones / inserciones eficientes del medio) a LinkedList<T>.

No estoy seguro si estás diciendo "estático" en la forma en que lo digo, ¿puedes aclararlo?

Para obtener información, puede usarla Array.Resize(ref myArray, newSize), pero esa no es la respuesta correcta para cambios frecuentes.

Respondida el 12/03/2009 a las 05:02
fuente por usuario Marc Gravell

votos
2

Por lo que se dice, no se puede cambiar la estructura de datos, así que hay que lidiar con las matrices.

Lo único en lo que puedes obtener ayuda realmente es que puedes evitar el ciclo y hacer un Array.copy

int oldLength = dataStruct.myStaticArray.Length;
myObject[] newMyObjectArray = new myObject[oldLength + 1];
Array.copy(dataStruct.myStaticArray, newMyObjectArray, oldLength);

dataStruct.myStaticArray[oldLength] = new myObject();
dataStruct.myStaticArray = newMyObjectArray;

EDITAR En realidad, esto podría funcionar:

int oldLength = dataStruct.myStaticArray.Length;
Array.Resize(dataStruct.myStaticArray, oldLength+1);
Respondida el 12/03/2009 a las 05:09
fuente por usuario Tom

votos
0

Cualquier cosa que pueda hacer para hacer una matriz más parecida a una ArrayListo List<T>simplemente hará que termine reimplementando parte (o todas) de esas clases. Lo mejor que puede hacer es usar las clases integradas, como han dicho las otras respuestas.

Respondida el 12/03/2009 a las 05:05
fuente por usuario Andy

votos
0

Básicamente estás escribiendo tu propia lista, pero de una manera menos eficiente.

List hace internamente lo que está describiendo, pero con una gran diferencia en cuanto a rendimiento.

Cuando reasigna su matriz interna, no solo agrega un nuevo elemento, sino que agrega un bloque de ellos. De esta forma, las adiciones futuras no siempre requieren una reasignación. Esta es la "Capacidad" de la lista, y por qué la capacidad de la lista es siempre> = el tamaño de la lista.

Si debes hacer esto, te recomendaría hacer algo similar. Sin embargo, cambiar a la Lista sería una opción mucho mejor.

Respondida el 12/03/2009 a las 05:04
fuente por usuario Reed Copsey