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和 分配wWindow。(编译器将在后台创建一个描述这种匿名类型的类,但您永远不需要直接处理它。)

    Select Ordinal = l_random.Next(),
           Window = w
    
  • 对匿名类型对象进行排序Ordinal。如果两个Ordinals 相同,那么它只会一个接一个地放置(可能基于 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 回答