OrderByメソッドは遅延実行されるため、メソッドを呼び出した時点では結果は確定していません。 OrderByメソッドの戻り値を列挙する(もしくは配列・リストに変換する)時点ではじめて結果が確定します。
そのため、次の例のように、OrderByメソッドを呼び出してその結果が確定する前に元のコレクションに変更を加えると、その変更はソート後の結果にも影響するという点に注意が必要です。
ソート元のコレクションに対する変更とOrderByメソッドの結果への影響
using System;
using System.Collections.Generic;
using System.Linq;
class Sample {
static void Main()
{
var list = new List<int>(new int[] {
3, 1, 2,
});
// ソート(この時点では結果が確定していない点に注意)
IOrderedEnumerable<int> sorted = list.OrderBy(val => val);
// 元になったリストに変更を加える
list.Add(5);
list.Add(4);
// 列挙して結果を表示
foreach (var val in sorted) {
Console.Write("{0} ", val);
}
Console.WriteLine();
}
}
実行結果
1 2 3 4 5
上記のように、列挙する時点でソートが行われるため、OrderByを呼び出した後に追加した要素もソートされた上で列挙されます。