Berücksichtigt die .Last()
Erweiterungsmethode, ob sie in IList
aufgerufen wird? Ich frage mich nur, ob es einen signifikanten Leistungsunterschied zwischen diesen gibt:
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?
Wahrscheinlich nicht, wie es list[list.count-1]
Bestätigt von Reflektor:
%Vor% 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.
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
und versuchen Sie es erneut, wir sehen
%Vor%in der Konsole zeigt an, dass der Indexer nie benutzt wurde.
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.
Tags und Links c#