LINQ
a によって取得された要素の順序は、少なくともLINQ to Object
、 for では保持されていると思いLINQ to SQL or Entity
ます。テーブル内のレコードの順序に依存する可能性があります。についてLINQ to Object
、順序が保たれる理由を説明してみます。
実際、LINQ
クエリが実行されると、IEnumerable
ソースは を呼び出してGetEnumerator()
でループを開始し、while loop
を使用して次の要素を取得しMoveNext()
ます。これは、ソースforeach
上でどのように機能するかです。a がリスト/コレクション内の要素の順序を保持することは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()
に実装されているかによって異なります。ただし、結果の要素の順序が、要素に対してループが機能する順序と同じであることは確かです。IEnumerator
IEnumerable
LINQ
foreach