我对 VB.Net 很陌生。
我正在编写一个类似于调查的程序。WPF 窗口按顺序依次弹出问题。现在,我的客户要求随机化一些窗口的顺序。我想我可能有一个窗口集合,并以随机顺序依次呈现这些窗口。但是,我没有找到任何有关它的信息。
有人可以向我展示如何将不同的窗口存储在某种集合中,然后按顺序显示它们吗?
我对 VB.Net 很陌生。
我正在编写一个类似于调查的程序。WPF 窗口按顺序依次弹出问题。现在,我的客户要求随机化一些窗口的顺序。我想我可能有一个窗口集合,并以随机顺序依次呈现这些窗口。但是,我没有找到任何有关它的信息。
有人可以向我展示如何将不同的窗口存储在某种集合中,然后按顺序显示它们吗?
你应该能够使用这样的东西:(未测试)
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
和 分配w
给Window
。(编译器将在后台创建一个描述这种匿名类型的类,但您永远不需要直接处理它。)
Select Ordinal = l_random.Next(),
Window = w
对匿名类型对象进行排序Ordinal
。如果两个Ordinal
s 相同,那么它只会一个接一个地放置(可能基于 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()
并将结果分配给一个变量。