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à.
No può fare, utilizzare il metodo Add(). –
Se si tratta di una lista sparsa (come 10,20 oggetti sparsi nell'intervallo 1000) si potrebbe effettivamente cercare "Dizionario" invece di una lista. –
@ssg Si tratta di una lista sparsa. Usare il dizionario è un buon suggerimento. Ma poi userei più spazio. Qualcosa di più semplice? – user1041086