问题:LINQ查询的结果是否始终保证输入正确?
示例:
int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
var lowNums =
from n in numbers
where n < 5
select n;
现在,当我们浏览查询结果的条目时,它是否与订购输入数据numbers
的顺序相同?
foreach (var x in lowNums)
{
Console.WriteLine(x);
}
如果有人可以在文档中提供有关订购的说明,这将是完美的。
答案 0 :(得分:5)
答案 1 :(得分:0)
我认为LINQ
检索到的元素的顺序(至少LINQ to Object
)保留LINQ to SQL or Entity
,它可能取决于表中记录的顺序。对于LINQ to Object
,我会尝试解释保留订单的原因。
实际上,当执行LINQ
查询时,IEnumerable
来源会调用GetEnumerator()
开始使用while loop
循环并使用{{1}获取下一个元素}}。这是MoveNext()
来源foreach
的工作原理。我们都知道 IEnumerable
将保留列表/集合中元素的顺序。深入研究foreach
,我认为它只有一些MoveNext()
来保存当前Position
和Index
只需增加MoveNext()
和Position
相应的元素(在新位置)。这就是为什么它应该保留订单,更改原始订单的所有代码都是多余的,或者明确地调用yield
或OrderBy
。
如果你认为这个
OrderByDescending
打印出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()
的{{1}}的实现方式。但是,肯定 IEnumerator
结果中元素的顺序与IEnumerable
循环对元素的作用顺序相同。