OrderByメソッドを使って配列・Listをソートする例について見ていきます。
OrderByメソッドを使って配列をソートする
using System;
using System.Linq;
class Sample {
static void Main()
{
// ソート対象の配列
var arr = new int[] {5, 2, 3, 1, 4};
// ソート
IOrderedEnumerable<int> sorted = arr.OrderBy(val => val);
// ソート後の結果を列挙して表示
foreach (var val in sorted) {
Console.Write("{0}, ", val);
}
Console.WriteLine();
}
}
実行結果
1, 2, 3, 4, 5,
Array.SortメソッドやList.Sortメソッドとは異なり、OrderByメソッドは元の配列・コレクションの状態を変更しません(非破壊的なソート)。 代わりにソート後の結果となるIOrderedEnumerable<TElement>を返します。
IOrderedEnumerable<TElement>はIEnumerable<T>から派生したインターフェイスで、後述する点を除けば違いを特に意識しなくてもIEnumerable<T>と同様に扱えます。 ほとんどの場合、この戻り値を直接列挙したり、他のコレクションに格納しなおしたりして使用することになります。
IEnumerable<T>についてはIEnumerable・IEnumeratorを参照してください。
OrderByメソッドは遅延実行されるため、戻り値のIOrderedEnumerable<TElement>に対してforeach等による列挙操作を行うことで初めてソートが行われます。 戻り値を即座に列挙したり、他のコレクションに格納する場合は特にこの動作を意識する必要はありませんが、§.元のコレクションに対する変更とOrderByメソッドの結果への影響で解説するように扱い方によっては意図に反する動作となる場合もあるので、遅延実行となることとその動作については把握しておく必要があります。