OrderByメソッドの引数keySelectorには、ソートの際に使用するキーを選択するメソッドへのデリゲート(またはラムダ式)を指定します。 先の例ではラムダ式を用いていましたが、これをメソッドとして展開すると次のようになります。

OrderByでのソートに使用されるキー選択のメソッドを指定する
using System;
using System.Linq;

class Sample {
  // ソートの際に使用するキーを選択するメソッド
  static int KeySelector(int val)
  {
    // 要素の値そのものをソートの際のキーとする
    return val;
  }

  static void Main()
  {
    // ソート対象の配列
    int[] arr = new int[] {5, 2, 3, 1, 4};

    // ソート
    IOrderedEnumerable<int> sorted = arr.OrderBy(KeySelector);

    foreach (int val in sorted) {
      Console.Write("{0}, ", val);
    }
    Console.WriteLine();
  }
}

OrderByメソッドの引数keySelectorとキー選択のメソッドについて詳しく見ていきます。

OrderByメソッドでは、ソートの際に何をキーとしてソートするかを引数keySelectorとして指定する必要があります。 これは、単純型でも複合型でもソートできるようにするために必要となるものです。 数値や文字列など単純型の配列・コレクションの場合は、単に要素そのもの(つまり数値の値や文字列自体)をキーとすればよいため、上記の例のように一見するとあまり意味のない記述となります。 しかし、Dictionaryや複合型の配列・コレクションの場合は、何を基準にソートするかによってキーを定める必要があるため、この引数が意味を持つようになります。

例として、文字列型のNameというプロパティを持つAccountクラスをソートしたい場合は、次のようにキー選択のメソッドを定義する必要があります。 この例を見れば、keySelectorの持つ意味が理解しやすくなると思います。

比較のために、先の例におけるキー選択のメソッドを抜粋します。 このメソッドでは、int/Integer型のソートをするために、そのキーとしてint/Integerの持つ値を選択しています。

このように、keySelectorには引数にソート対象をとり、戻り値としてソート対象のキーを返すメソッド(またラムダ式)を指定します。