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.
Verwenden Sie 'var lowNums = numbers.Where (x => x <5).OrderBy (x => x); ' –
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