Gibt es einen Unterschied in der (asymptotischen) Leistung zwischen
? %Vor%und
%Vor%d. Wird First () die OrderBy () ausführen? Ich vermute nein. MSDN sagt, dass die Auflistung über foreach och GetEnumerator aufgezählt wird, aber die Formulierung schließt andere Erweiterungen nicht aus.
Ein paar Dinge:
OrderBy()
Ordnungen von klein zu groß, also geben Ihre zwei Alternativen unterschiedliche Elemente zurück Where()
ist in der Regel faul, so dass Ihr zweiter Ausdruck überhaupt keine Berechnungen durchführt - erst, wenn er verwendet wird. First()
erkennt (entweder zur Kompilierung oder zur Laufzeit), dass er auf einer geordneten Aufzählung ausgeführt wird und statt der Sortierung zurückgibt das (erste) minimale Element. IEnumerable<T>
-Provider gibt OrderBy
einen Enumerable zurück, der die Eingabe jedes Mal, wenn das erste Element abgerufen wird, vollständig puffert und sortiert - also im Fall der gemeinsamen grundlegenden Linq-to-Objects-Methode OrderBy().First()
ist vergleichbar mit OrderBy().ToArray()
. Denken Sie daran, dass es sich bei linq nur um eine Reihe von Funktionsnamen handelt - jeder Anbieter kann diese unterschiedlich implementieren, so dass das obige nur für den System.Linq IEnumerable-Abfrageanbieter und nicht unbedingt für andere gilt.
Die Methode First
führt die OrderBy
aus (das heißt, die Methode First
wird natürlich ausgeführt). Wenn die Methode First
das erste Element aus dem Ergebnis von OrderBy
zieht, muss es alle Elemente sortieren, um herauszufinden, welches das erste Element ist.
Je nachdem, wo und wie die Abfrage ausgeführt wird (d. h. wenn die Abfrage-Engine nicht in der Umgebung optimieren kann), kann die zweite Abfrage ziemlich schlecht ausgeführt werden. Wenn Orders.Max
einmal für jedes Element in Orders
ausgewertet wird, wird es zu einer O (n * n) -Operation, die ziemlich schlecht ist.
Es gibt auch einen funktionalen Unterschied, die zweite Abfrage kann mehr als ein Element zurückgeben, wenn doppelte Daten vorhanden sind.
First
gibt den ersten Eintrag des übergebenen IEnumerable zurück. Da IEnumerable an First
übergeben wurde, ist das Ergebnis von OrderBy
. Ihre Frage kann zu "Does OrderBy
work" umformuliert werden, und, ja, tut es.
First
kann die Ausführung von OrderBy
nicht verzögern, da das Ergebnis sofort zurückgegeben wird. Zum Beispiel:
Es tut es nicht. DAS WIRD GESAGT - natürlich wird die Bestellung von dem Moment ausgeführt, an dem jemand versucht, das erste Element tatsächlich zu ERHALTEN.
Aber wie Sie gesagt haben, können die Bedingungen weiter definiert werden. Als solches, nein - es wird in diesem Moment nicht ausgeführt.
Tags und Links linq linq-extensions