OrderByメソッドを使って配列・Listをソートする例について見ていきます。
OrderByメソッドを使ってListをソートする
Imports System
Imports System.Collections.Generic
Imports System.Linq
Class Sample
Shared Sub Main()
' ソート対象のList(Of Integer)
Dim list As New List(Of Integer)(New Integer() {5, 2, 3, 1, 4})
' ソート
Dim sorted As IOrderedEnumerable(Of Integer) = list.OrderBy(Function(val) val)
' ソート後の結果を列挙して表示
For Each val As Integer In sorted
Console.Write("{0}, ", val)
Next
Console.WriteLine()
End Sub
End Class
実行結果
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メソッドの結果への影響で解説するように扱い方によっては意図に反する動作となる場合もあるので、遅延実行となることとその動作については把握しておく必要があります。