我认为 a 检索到的元素的顺序LINQ
是保留的,至少 for LINQ to Object
, for LINQ to SQL or Entity
,它可能取决于表中记录的顺序。对于LINQ to Object
,我将尝试解释为什么它会保留顺序。
事实上,当LINQ
查询被执行时,IEnumerable
源代码会调用 toGetEnumerator()
来开始循环 awhile loop
并使用 . 获取下一个元素MoveNext()
。这就是 aforeach
在IEnumerable
源代码上的工作方式。我们都知道 aforeach
将保留列表/集合中元素的顺序。更深入地挖掘MoveNext()
,我认为它只是有一些Position
保存当前Index
并MoveNext()
增加Position
和yield
相应的元素(在新位置)。这就是为什么它应该保留顺序,所有更改原始顺序的代码都是多余的,或者通过显式调用OrderBy
orOrderByDescending
。
如果你认为这
int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
foreach(var i in numbers)
if(i < 5) Console.Write(i + " ");
打印出来4 1 3 2 0
你应该这样认为
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 + " ");
}
也打印出来4 1 3 2 0
。因此这个LINQ
查询
var lowNums = from n in numbers
where n < 5
select n;
foreach (var i in lowNums) {
Console.Write(i + " ");
}
也应该打印出来4 1 3 2 0
。
结论:元素的顺序LINQ
取决于从MoveNext()
anIEnumerator
获得的 anIEnumerable
的实现方式。但是,可以肯定的是,结果中元素的顺序LINQ
将与foreach
循环在元素上工作的顺序相同。