Ist die ListT.Remove (T) - oder ListT.RemoveAt (int) -Methode schneller?

8

Ist die Methode List<T>.Remove(T) oder List<T>.RemoveAt(int) in .NET-Sammlungen schneller? Ist die Geschwindigkeit für Werttypen oder Referenztypen unterschiedlich?

    
abenci 09.07.2010, 10:19
quelle

5 Antworten

15

List.Remove (T) verwendet in seiner Implementierung IndexOf und RemoveAt (int). So ist List.RemoveAt (int) schneller.

%Vor%     
DevExpress Team 09.07.2010, 10:23
quelle
19

Einfache Antwort:

Im Allgemeinen ist RemoveAt schneller, aber nicht immer sehr groß.

Lange Antwort:

Sehen wir uns zuerst den passenden Gegenstand an. Die Methode Remove muss die Liste nach dem Objekt durchsuchen, das mit dem angegebenen Objekt übereinstimmt, und ist daher im Allgemeinen O(n) time. RemoveAt auf einer Liste kann den angegebenen Eintrag einfach indexieren und ist somit O(1) .

Nun ist das Entfernen eines Elements vom Ende einer Liste immer O(1) natürlich, aber im Allgemeinen dauert das Entfernen eines Elements O(n) time, da das Umordnen durchgeführt werden muss (Verschieben von Elementen nach dem entfernten Element). Daher ist im Allgemeinen die gesamte Zeitkomplexität für das Entfernen entweder O(n) + O(n) oder O(n) + O(1) für Remove bzw. RemoveAt, also in beiden Fällen einfach O(n) . % Co_de% ist jedoch garantiert mindestens genauso schnell, obwohl die Skalierung die gleiche ist, es sei denn, Sie wissen, dass Sie sie am Ende des Vorgangs entfernen.

    
Noldorin 09.07.2010 10:25
quelle
0

Entfernen (T) macht intern einen Aufruf von RemoveAt (int) Also, tun Sie direkt eine removeAt ist schneller.

Aber was möchten Sie erreichen?

    
cRichter 09.07.2010 10:24
quelle
0

Da ein .Net einen Vektor (oder ein Array) infiziert, keine verknüpfte Liste, ist RemoveAt () schneller.

    
Ian Ringrose 24.08.2010 15:48
quelle
0

Verwenden Sie System.Diagnostics.Stopwatch()

Ich hätte gerade eine kleine Konsolen-App erstellt, um zu überprüfen, welche schneller ist.

    
HarveySaayman 09.07.2010 10:51
quelle

Tags und Links