2011-12-13 16 views
7

Si declaro una lista C#. Haga que su capacidad sea 1000. Ahora, si quiero agregar un elemento directamente en el índice 1. No puedo hacerlo. Lanzamiento de error ¿Hay alguna alternativa disponible?Agregar miembros a la lista C# utilizando los índices

List<sometype> myList = new List<sometype>() 
    myList.capacity = 1000; 
    myList[1] = element; //exception thrown 

La mejor alternativa que encontré es a través de una matriz.

sometype[] myarray = new sometype[1000]; 
    myarray[1] = element; 
    //after filling whole array 
    myarray.ToList(); 
+0

No se puede hacer, use el método Add(). –

+2

Si se trata de una lista dispersa (como 10,20 elementos dispersos en el rango 1000), en realidad podría estar buscando un 'Diccionario ' en lugar de una Lista. –

+0

@ssg Sí, es una lista dispersa. Usar Dictionary es una buena sugerencia. Pero luego estaría usando más espacio. ¿Algo más simple? – user1041086

Respuesta

2

Se puede utilizar el método Insert(), como a continuación:

myList.Insert(1, element); //1 is the index 
0
List<sometype> myList = new List<sometype>() 
myList.capacity = 1000; 
myList.Add(null); 
myList.Add(null); 
myList.Insert(1, element); //exception not thrown 
+0

Me da un error. ¿Lo estás entendiendo también? – user1041086

+0

¿Qué error estás recibiendo? – danludwig

+0

-1 No puede insertar en una posición inferior a Contar, ni está tratando de realizar una inserción que cambiará las compensaciones de todo después de ese elemento. –

3

La mejor alternativa que he encontrado es a través de la matriz.

correcta, la mayoría se utilice una matriz para esto como usted demostró ...

sometype[] myarray = new sometype[1000]; 
myarray[1] = element; 

La otra opción es comprobar los límites antes de ajustar el elemento de la lista ...

List<sometype> myList = new List<sometype>() 
myList.capacity = 1000; 
if(ix < myList.Count) 
    myList[1] = element; //replace element 
else 
{ 
    while(myList.Count < (ix-1)) 
     myList.Add(default(sometype)); //fill with empty 

    myList.Add(element); 
} 
5

List.Capacity solo preasigna memoria para que la lista pueda crecer hasta el límite de capacidad sin incurrir en asignaciones de memoria adicionales y fragmentación de pila asociada. Establecer List.Capacity en 1000 no hace que 1000 entradas sean accesibles. List.Count indica el final del contenido de la lista real. List.Insert() no se puede usar para insertar elementos más allá de List.Count.

Su solución alternativa de crear una matriz de 1000 elementos y luego convertirla en una lista es simplemente un atajo para llamar a List.Add() 1000 veces para asignar espacios vacíos en la lista (presione List.Count a 1000). Llamar List.Add() 1000 veces es más eficiente desde el punto de vista de la memoria, ya que con la técnica de matriz habrá 2 copias de la lista en la memoria (1 para la matriz y 1 para la lista).

Ha descartado la sugerencia de utilizar un Dictionary<int, sometype> para una matriz dispersa porque usaría más memoria que una matriz escasamente poblada. Eso depende de cuán escasos sean sus datos. Si solo tiene 100 elementos en un rango de índice de 0..1000, tiene una densidad del 10%. También puede llamar a ese 90% de memoria desperdiciada.

Es casi seguro que un diccionario será más eficiente en cuanto a la memoria para una matriz dispersa de baja densidad que la asignación de una matriz de 1000 elementos, pero solo utilizando 100 de las ranuras. No conozco los detalles de la implementación del diccionario o el uso de la memoria, pero probablemente sea una suposición segura que si la densidad de su matriz dispersa es 50% o mayor, usar una matriz en lugar de un diccionario gana para la memoria y la velocidad.

1

Edita la respuesta de csharptest.net.

List<sometype> myList = new List<sometype>() 
while (index >= myList.Count) 
    myList.Add(default(sometype)); //fill with empty 
myList[1] = element; 
Cuestiones relacionadas