LINQ查询的结果是否始终保证正确的顺序?

时间:2013-08-12 22:12:17

标签: c# linq

问题: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); 
  } 

如果有人可以在文档中提供有关订购的说明,这将是完美的。

2 个答案:

答案 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()来保存当前PositionIndex只需增加MoveNext()Position相应的元素(在新位置)。这就是为什么它应该保留订单,更改原始订单的所有代码都是多余的,或者明确地调用yieldOrderBy

如果你认为这个

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循环对元素的作用顺序相同