Wird zuerst () die OrderBy () ausführen?

8

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.

    
Martin 16.03.2010, 14:15
quelle

4 Antworten

7

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.
  • Das fragliche Verhalten hängt im Prinzip vom Abfrageanbieter ab. Sie könnten beispielsweise erwarten, dass der sql-server linq query-Provider anders als der IEnumerable-Abfrageprovider behandelt. Ein Abfrageprovider wählt möglicherweise, dass der Rückgabewert von "OrderBy" ausreichend spezialisiert ist, so dass der Aufruf von 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.
  • Speziell für den 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.

    
Eamon Nerbonne 16.03.2010, 14:45
quelle
6

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.

    
Guffa 16.03.2010 14:24
quelle
5

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:

%Vor%     
Klaus Byskov Pedersen 16.03.2010 14:21
quelle
0

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.

    
TomTom 16.03.2010 14:19
quelle

Tags und Links