2013-08-12 6 views
5

Frage: Wird das Ergebnis einer LINQ-Abfrage immer in der richtigen Reihenfolge angezeigt?Wird das Ergebnis einer LINQ-Abfrage immer in der richtigen Reihenfolge angezeigt?

Beispiel:

int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }; 

var lowNums = 
    from n in numbers 
    where n < 5 
    select n; 

Nun, wenn wir durch die Einträge des Abfrageergebnisses gehen, wird es in der gleichen Reihenfolge wie die Eingangsdaten sein numbers wird bestellt?

foreach (var x in lowNums) 
    { 
    Console.WriteLine(x); 
    } 

Wenn jemand eine Notiz über die Bestellung in der Dokumentation bereitstellen kann, wäre dies perfekt.

+0

Verwenden Sie 'var lowNums = numbers.Where (x => x <5).OrderBy (x => x); ' –

+1

Vielleicht hilft das: http://stackoverflow.com/questions/6146724/do-linqs-enumerable-methods-maintain-relative-order-of-elements. Wenn es ein IEnumerable ist, wird die ursprüngliche Reihenfolge beibehalten. – thepirat000

Antwort

4
+0

Finden Sie eine Dokumentation, die garantiert, dass die Bestellung für Linq-To-Objekte gleich bleibt? –

+0

@TimSchmelter Ich bin mir ziemlich sicher, dass die Ärzte das Gegenteil sagen, oder besser gesagt, überhaupt nichts sagen. – evanmcdonnal

+0

@evanmcdonnal: Ich bin ziemlich sicher, dass die Dokumente nichts sagen, auch wenn ich sicher bin, dass es die Reihenfolge in 'Select' oder anderen Linq-Methoden nicht ändert. –

0

Ich denke, die Reihenfolge der Elemente durch eine LINQ abgerufen erhalten bleibt, zumindest für LINQ to Object, für LINQ to SQL or Entity, kann es auf die Reihenfolge der Datensätze in der Tabelle ab. Für LINQ to Object, werde ich versuchen zu erklären, warum es die Reihenfolge erhält.

In der Tat, wenn die LINQ Abfrage ausgeführt wird, wird die IEnumerable Quelle GetEnumerator() ruft mit einem while loop zu starten Looping und das nächste Element MoveNext() mit bekommen. So funktioniert ein foreach auf der IEnumerable Quelle. Wir alle wissen, dass ein foreach die Reihenfolge der Elemente in einer Liste/Sammlung erhalten wird. Graben tiefer in die MoveNext(), ich denke, es hat nur einige Position zu speichern die aktuellen Index und MoveNext() nur die Position und yield das entsprechende Element (an der neuen Position) zu erhöhen. Deshalb sollte die Reihenfolge beibehalten werden. Der gesamte Code, der die ursprüngliche Reihenfolge ändert, ist redundant oder durch expliziten Aufruf an OrderBy oder OrderByDescending.

Verstößt dieses

int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }; 
foreach(var i in numbers) 
    if(i < 5) Console.Write(i + " "); 

druckt 4 1 3 2 0 sollten Sie denken, das

int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }; 
IEnumerator ie = numbers.GetEnumerator(); 
while(ie.MoveNext()){ 
    if((int)ie.Current < 5) Console.Write(ie.Current + " "); 
} 

auch 4 1 3 2 0 ausdruckt. Daher ist diese LINQ Abfrage

var lowNums = from n in numbers 
       where n < 5 
       select n; 
foreach (var i in lowNums) { 
    Console.Write(i + " "); 
} 

sollte auch 4 1 3 2 0 ausdrucken.

Fazit: die Reihenfolge der Elemente in LINQ davon abhängt, wie MoveNext() ein IEnumerator von einem IEnumerable erhielt implementiert ist. Allerdings ist es sicher, dass die Reihenfolge der Elemente in LINQ Ergebnis wird die gleiche Reihenfolge ein foreach Schleife funktioniert auf die Elemente.

Verwandte Themen