Nella mia mente, lo List
viene sostanzialmente implementato utilizzando LinkedList
, mentre un normale Array
viene implementato come blocchi contigui. Ho sempre usato List
perché è nello spazio dei nomi Generic
e perché pensavo che fosse utilizzato l'allocazione della memoria dinamica - ma mi sbagliavo.Perché SortedList e List usano array e perché LinkList non è molto usato?
Ieri ho visto l'implementazione di List
utilizzando Reflector e trovato che è in realtà una matrice di T (T[]
). Ci sono un sacco di Array.Copy
in giro mentre si manipola ciascun elemento nello List
. Ad esempio, quando si utilizza Insert
, verrà creata una nuova memoria e verranno copiati tutti gli elementi prima/dopo gli elementi inseriti. Quindi mi sembra che l'uso di List
sia molto costoso.
Ho visto anche lo SortedList
. Non sono sicuro del perché un SortedList
implementa anche un array al suo interno. Non pensi che SortedList
sarebbe orribile utilizzare un array in quanto è necessario ordinare l'elenco ogni volta che si verifica una piccola manipolazione dello List
?
Mi chiedo anche perché lo List
sia così popolare come la maggior parte delle persone lo usa piuttosto che andare per LinkedList
. È solo a causa della flessibilità dell'indicizzatore?
Guarda più vicino: Elenco <> * non * crea un nuovo array e copia tutti gli elementi su * ogni * chiamata. L'array viene ridimensionato solo quando è pieno e viene ridimensionato al doppio delle dimensioni originali. Il ridimensionamento avviene solo ad intervalli esponenzialmente crescenti quando si aggiungono continuamente elementi. – dtb
Non c'è una risposta corretta a questa domanda. Pensa se essere più specifico o contrassegnare come wiki –
@dtb yes usa this._items [this._size ++] = elemento; Sì, aumenta in modo esponenziale gli intervalli, ma come fa sempre a garantire che la dimensione ++ abbia uno spazio vuoto? – abhishek