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

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

Class Sample
  ' ソートの際に使用するキーを選択するメソッド
  Shared Function KeySelector(ByVal val As Integer) As Integer
    ' 要素の値そのものをソートの際のキーとする
    Return val
  End Function

  Shared Sub Main()
    ' ソート対象の配列
    Dim arr() As Integer = New Integer() {5, 2, 3, 1, 4}

    ' ソート
    Dim sorted As IOrderedEnumerable(Of Integer) = arr.OrderBy(AddressOf KeySelector)

    For Each val As Integer In sorted
      Console.Write("{0}, ", val)
    Next
    Console.WriteLine()
  End Sub
End Class

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

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

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

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

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