2011-12-13 8 views
7

Se si dichiara un elenco C#. Rendere la sua capacità a 1000. Ora, se voglio aggiungere un elemento direttamente all'indice 1. Non riesco a farlo. Errore di lancio Ci sono alternative disponibili?Aggiunta di membri all'elenco C# utilizzando gli indici

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

La migliore alternativa che ho trovato è attraverso la matrice.

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

No può fare, utilizzare il metodo Add(). –

+2

Se si tratta di una lista sparsa (come 10,20 oggetti sparsi nell'intervallo 1000) si potrebbe effettivamente cercare "Dizionario " invece di una lista. –

+0

@ssg Si tratta di una lista sparsa. Usare il dizionario è un buon suggerimento. Ma poi userei più spazio. Qualcosa di più semplice? – user1041086

risposta

2

È possibile utilizzare il metodo Insert(), come di seguito:

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

Mi dà un errore. Lo stai prendendo anche tu? – user1041086

+0

Che errore stai ottenendo? – danludwig

+0

-1 Non è possibile inserire in una posizione inferiore a Count, né sta tentando di eseguire un inserimento che modificherà gli offset di tutto dopo quella voce. –

3

L'alternativa migliore che ho trovato è attraverso array.

corretta, la maggior parte utilizzare un array per questo come avete dimostrato ...

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

L'altra opzione è quella di controllare i limiti prima di impostare l'elemento della 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 prealloca solo la memoria in modo che l'elenco possa crescere fino al limite di capacità senza incorrere in allocazioni di memoria aggiuntive e frammentazione heap associata. Impostare List.Capacity su 1000 non rende accessibili 1000 voci. List.Count indica la fine del contenuto della lista reale. List.Insert() non può essere utilizzato per inserire elementi oltre List.Count.

La soluzione alternativa alla creazione di un array di 1000 elementi e la conversione in elenco è semplicemente una scorciatoia per chiamare List.Add() 1000 volte per allocare spazi vuoti nell'elenco (premere List.Count a 1000). Chiamare List.Add() 1000 volte è più efficiente in termini di memoria, dato che con la tecnica array ci saranno 2 copie dell'elenco in memoria (1 per l'array e 1 per l'elenco).

Hai scartato il suggerimento di utilizzare uno Dictionary<int, sometype> per un array sparse perché userebbe più memoria di un array scarsamente popolato. Dipende da quanto sono sparsi i tuoi dati. Se hai solo 100 articoli in un intervallo di indice di 0.000, hai una densità del 10%. Puoi anche chiamare quella memoria sprecata al 90%.

Un dizionario sarà quasi sicuramente più efficiente in termini di memoria per un array sparse a bassa densità rispetto all'allocazione di un array di 1000 elementi ma utilizzando solo 100 degli slot. Non conosco le specifiche dell'implementazione o dell'uso della memoria del dizionario, ma probabilmente è un'ipotesi che se la densità dell'array sparse è pari o superiore al 50%, l'utilizzo di una matrice anziché di un dizionario vince per memoria e velocità.

1

Modifica la risposta di csharptest.net.

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