OrderByメソッドの引数keySelectorには、ソートの際に使用するキーを選択するメソッドへのデリゲート(またはラムダ式)を指定します。 先の例ではラムダ式を用いていましたが、これをメソッドとして展開すると次のようになります。
OrderByでのソートに使用されるキー選択のメソッドを指定する
using System;
using System.Linq;
class Sample {
// ソートの際に使用するキーを選択するメソッド
static int KeySelector(int val)
{
// 要素の値そのものをソートの際のキーとする
return val;
}
static void Main()
{
// ソート対象の配列
var arr = new int[] {5, 2, 3, 1, 4};
// ソート
IOrderedEnumerable<int> sorted = arr.OrderBy(KeySelector);
foreach (var val in sorted) {
Console.Write("{0}, ", val);
}
Console.WriteLine();
}
}
OrderByメソッドの引数keySelectorとキー選択のメソッドについて詳しく見ていきます。
OrderByメソッドでは、ソートの際に何をキーとしてソートするかを引数keySelectorとして指定する必要があります。 これは、単純型でも複合型でもソートできるようにするために必要となるものです。 数値や文字列など単純型の配列・コレクションの場合は、単に要素そのもの(つまり数値の値や文字列自体)をキーとすればよいため、上記の例のように一見するとあまり意味のない記述となります。 しかし、Dictionaryや複合型の配列・コレクションの場合は、何を基準にソートするかによってキーを定める必要があるため、この引数が意味を持つようになります。
例として、文字列型のNameというプロパティを持つAccountクラスをソートしたい場合は、次のようにキー選択のメソッドを定義する必要があります。 この例を見れば、keySelectorの持つ意味が理解しやすくなると思います。
比較のために、先の例におけるキー選択のメソッドを抜粋します。 このメソッドでは、int/Integer型のソートをするために、そのキーとしてint/Integerの持つ値を選択しています。
このように、keySelectorには引数にソート対象をとり、戻り値としてソート対象のキーを返すメソッド(またラムダ式)を指定します。