次のようなものを使用できるはずです:(テストされていません)
Dim l_windows As New List(Of Window)
' However you want to go about populating your list of windows...
l_windows.Add( new Window1() )
l_windows.Add( new Window2() )
Dim l_random As New Random()
Dim l_randomWindows = From w In l_windows
Select Ordinal = l_random.Next(),
Window = w
Order By Ordinal
Select Window
For Each l_window in l_randomWindows
l_window.Show()
Next
標準の .NET ランダマイザーは疑似乱数にすぎず、統計目的などでランダム性が必要な場合は適切な選択ではないことに注意してください (ただし、より優れた乱数ジェネレーターを見つけるのは難しくありません)。
LINQ クエリの説明:
l_windows を反復処理し、コレクション内の各アイテムをw
From w In l_windows
ごとw
に、乱数をOrdinal
に割り当てる と に割り当てる という 2 つのプロパティを持つ新しい匿名オブジェクトを作成w
しWindow
ます。(コンパイラはバックグラウンドでこの匿名型を記述するクラスを作成しますが、それを直接処理する必要はありません。)
Select Ordinal = l_random.Next(),
Window = w
無名の型付きオブジェクトを で並べ替えますOrdinal
。2 つOrdinal
の s が同じである場合は、単純に 1 つずつ配置されます (テストはしていませんが、おそらく l_window の元の順序に基づいています)。
Order By Ordinal
新たに並べ替えられたリスト内の型指定された匿名オブジェクトごとに、Window プロパティに割り当てられたオブジェクトを選択します。LINQ は、単一のプロパティで匿名型を作成するのではなく、値を選択できるほどスマートです。
Select Window
次に、IEnumerable(Of Window)
が に割り当てられl_randomWindows
ます。
IEnumerable によって表されるオブジェクトは、それ自体がコレクションではないことに注意してください。For
コンパイラは実際にクエリ オブジェクトを作成しますが、これは (ループのように) コレクションから実際に項目を取得しようとするまで実行されません。このクエリは何度も実行され、毎回異なる順序で結果が返されます ( がl_random.Next()
毎回呼び出されるため)。
安定したコレクションを取得したい場合は、単にl_randomWindows.ToList()
orl_randomWindows.ToArray()
を呼び出して、結果を変数に割り当てます。