0

私はVB.Netを初めて使用します。

私は調査に似たプログラムを書いています。WPFウィンドウがポップアップし、質問が順番に次々に表示されます。今、私のクライアントはいくつかのウィンドウの順序をランダム化するように依頼しました。ウィンドウのコレクションを作成して、これらのウィンドウをランダムな順序で順番に表示できるのではないかと思いました。しかし、私はそれに関する情報を見つけていません。

ある種のコレクションにさまざまなウィンドウを保存し、それらを順番に表示する方法の例を誰かに教えてもらえますか?

4

1 に答える 1

3

次のようなものを使用できるはずです:(テストされていません)

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 つのプロパティを持つ新しい匿名オブジェクトを作成wWindowます。(コンパイラはバックグラウンドでこの匿名型を記述するクラスを作成しますが、それを直接処理する必要はありません。)

    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()を呼び出して、結果を変数に割り当てます。

于 2013-03-21T19:47:24.983 に答える