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