2015-04-25 4 views
6

Secondo Microsoft documentation, chiamare Clear() su un elenco è un'operazione O (n). Suppongo che questo sia dovuto al fatto che se la lista dovesse contenere riferimenti, sarebbe necessario annullarli. Mi chiedevo se Clear() è ancora un'operazione O (n) se l'elenco ha tipi di valore, poiché la capacità non viene modificata. Non dovrebbe essere sufficiente ripristinare il puntatore dell'indice e contare?C# sta cancellando un elenco <T> con tipi di valore ancora un'operazione O (n)?

Sto chiedendo questo perché in un'applicazione corrente stiamo usando elenchi che vengono cancellati centinaia di migliaia di volte in un lasso di tempo molto breve, e volevamo sapere se ci potrebbe essere un'implementazione diversa che lo rende più veloce.

+5

Un tipo di valore può contenere un riferimento che l'utente si aspetterebbe di essere andato dopo aver chiamato 'Cancella'. Devi sovrascrivere o riallocare l'intero array sottostante nel caso generale. –

+2

che dire solo chiamando la nuova lista e lasciando che GC gestisca la rimozione del contenuto dalla memoria? Forse potresti implementare un'estensione che gestisce la sovrascrittura e la dimensione del "nuovo" (non nuovo ma sovrascritto contenuto) che significa che non si elimina mai. –

+1

L'elenco potrebbe non essere il tipo di dati per te. –

risposta

4

Controllo in List.Clear codice sorgente metodo:

Array.Clear(_items, 0, _size); 
_size = 0; 

Array.Clear è un metodo extern ed economico MSDN circa Array.Clear è:

Imposta un intervallo di elementi in un array di il valore predefinito di ciascun tipo di elemento.

Quindi è ancora un'operazione O (n) anche se T è un tipo di valore.

Problemi correlati