2015-04-25 1 views
6

Nach dem Microsoft documentation Aufruf von Clear() auf einer Liste ist ein O (n) Vorgang. Ich schätze, das ist, weil wenn die Liste Referenzen enthalten würde, müsste sie sie auf Null setzen. Ich frage mich, ob Clear() immer noch eine Operation O (n) ist, wenn die Liste Werttypen hat, da die Kapazität nicht geändert wird. Sollte es nicht ausreichen, den Indexzeiger zurückzusetzen und zu zählen?C# Löscht eine Liste <T> mit Werttypen immer noch eine O (n) Operation?

Ich frage das, weil wir in einer aktuellen Anwendung Listen verwenden, die in einer sehr kurzen Zeitspanne hunderttausende Male gelöscht werden, und wollten wissen, ob es eine andere Implementierung geben könnte, die es schneller macht.

+5

Ein Werttyp könnte eine Referenz enthalten, die der Benutzer nach dem Aufrufen von 'Clear' wahrscheinlich nicht mehr sehen würde. Sie müssen das gesamte zugrunde liegende Array im allgemeinen Fall überschreiben oder neu zuweisen. –

+2

Wie wäre es, wenn Sie einfach die neue Liste aufrufen und GC den Inhalt aus dem Speicher entfernen lassen? Möglicherweise könnten Sie eine Erweiterung implementieren, die das Überschreiben und die Größe der Liste "neu" (nicht neu, aber überschriebener Inhalt) übernimmt, was bedeutet, dass Sie nie löschen. –

+1

Die Liste darf nicht der Datentyp für Sie sein. –

Antwort

4

Inspizieren in List.Clear Verfahren Quellcode:

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

Array.Clear ist ein extern Methode und MSDN Aussage über Array.Clear ist:

Sets einen Bereich von Elementen in einem Array der Standardwert für jeden Elementtyp.

Es ist also immer noch eine O (n) -Operation, auch wenn T ein Werttyp ist.

Verwandte Themen