7

質問: 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); 
  } 

ドキュメントの順序に関するメモを誰かが提供できれば、これは完璧です。

4

2 に答える 2

6
于 2013-08-12T22:15:43.010 に答える
0

LINQa によって取得された要素の順序は、少なくともLINQ to Object、 for では保持されていると思いLINQ to SQL or Entityます。テーブル内のレコードの順序に依存する可能性があります。についてLINQ to Object、順序が保たれる理由を説明してみます。

実際、LINQクエリが実行されると、IEnumerableソースは を呼び出してGetEnumerator()でループを開始し、while loopを使用して次の要素を取得しMoveNext()ます。これは、ソースforeach上でどのように機能するかです。a がリスト/コレクション内の要素の順序を保持することはIEnumerable誰もが知っています。をさらに深く掘り下げると、現在を保存し、対応する要素を(新しい位置で)増やすだけのものがいくつかあると思います。そのため、順序を保持する必要があります。元の順序を変更するすべてのコードは冗長であるか、またはを明示的に呼び出すことによって行われますforeachMoveNext()PositionIndexMoveNext()PositionyieldOrderByOrderByDescending

こう思ったら

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()に実装されているかによって異なります。ただし、結果の要素の順序が、要素に対してループが機能する順序と同じであることは確かです。IEnumeratorIEnumerableLINQforeach

于 2013-08-13T03:18:52.913 に答える