Führt das Aufrufen von .Last () auf einer IList die gesamte Liste durch? [Duplikat]

8

Berücksichtigt die .Last() Erweiterungsmethode, ob sie in IList aufgerufen wird? Ich frage mich nur, ob es einen signifikanten Leistungsunterschied zwischen diesen gibt:

%Vor%

Intuition sagt mir, dass die erste Alternative O (n) ist, aber die zweite ist O (1). Ist .Last() "intelligent" genug, um es in IList zu transformieren?

    
Scott Whitlock 28.01.2011, 21:27
quelle

5 Antworten

19

Wahrscheinlich nicht, wie es list[list.count-1]

kann

Bestätigt von Reflektor:

%Vor%     
Ohad Schneider 28.01.2011, 21:28
quelle
6

Dies ist eine undokumentierte Optimierung, aber die Prädikat-lose Überladung von Enumerable.Last springt tatsächlich direkt zum Ende.

Beachten Sie, dass die Überladung mit ein Prädikat nicht nur vom Ende ausgeht und rückwärts arbeitet, wie Sie vielleicht erwarten - es geht von vorne an. Ich glaube, das ist, um Inkonsistenzen zu vermeiden, wenn das Prädikat eine Ausnahme auslösen kann (oder andere Nebenwirkungen verursachen könnte).

Siehe mein Blogbeitrag über die Implementierung von First / Last / Single usw. für weitere Informationen - und eine Inkonsistenz, welche zwischen den Überladungen von Single / SingleOrDefault vorhanden ist.

    
Jon Skeet 28.01.2011 21:35
quelle
3

Reflektor:

%Vor%     
wj32 28.01.2011 21:29
quelle
1

Antwort: Ja.

Hier ist ein guter Weg, das herauszufinden:

%Vor%

Dann:

%Vor%

Ausgabe:

%Vor%

Wenn Sie Folgendes versuchen:

%Vor%

Dann erhalten Sie eine Ausnahme in GetEnumerator , die anzeigt, dass versucht wird, die Liste zu durchlaufen. Wenn wir GetEnumerator über

implementieren %Vor%

und versuchen Sie es erneut, wir sehen

%Vor%

in der Konsole zeigt an, dass der Indexer nie benutzt wurde.

    
jason 28.01.2011 21:34
quelle
0

Originalplakat spricht von einer Schnittstelle, nicht von der Implementierung.

Es hängt also von der zugrundeliegenden Implementierung hinter der IList/Ilist<T> ab. Sie wissen nicht, wie sein Indexer implementiert ist. Ich glaube, die List<T> des Frameworks hat eine konkrete Implementierung, die ein Array verwendet, so dass eine direkte Suche möglich ist, aber wenn Sie nur einen Verweis auf IList<T> haben, ist das keineswegs gegeben.

    
Nicholas Carey 28.01.2011 21:37
quelle

Tags und Links