OrderByメソッドは遅延実行されるため、メソッドを呼び出した時点では結果は確定していません。 OrderByメソッドの戻り値を列挙する(もしくは配列・リストに変換する)時点ではじめて結果が確定します。
そのため、次の例のように、OrderByメソッドを呼び出してその結果が確定する前に元のコレクションに変更を加えると、その変更はソート後の結果にも影響するという点に注意が必要です。
ソート元のコレクションに対する変更とOrderByメソッドの結果への影響
Imports System
Imports System.Collections.Generic
Imports System.Linq
Class Sample
Shared Sub Main()
Dim list As New List(Of Integer)(New Integer() { _
3, 1, 2 _
})
' ソート(この時点では結果が確定していない点に注意)
Dim sorted As IOrderedEnumerable(Of Integer) = list.OrderBy(Function(val) val)
' 元になったリストに変更を加える
list.Add(5)
list.Add(4)
' 列挙して結果を表示
For Each val As Integer In sorted
Console.Write("{0} ", val)
Next
Console.WriteLine()
End Sub
End Class
実行結果
1 2 3 4 5
上記のように、列挙する時点でソートが行われるため、OrderByを呼び出した後に追加した要素もソートされた上で列挙されます。