我是VB.Net的新手。
我正在编写类似于调查的程序。 WPF窗口按顺序依次弹出问题。现在,我的客户要求为一些窗口随机化订单。我想我可能有一个窗口集合,并按随机顺序呈现这些窗口。但是,我没有找到任何相关信息。
有人可以向我展示如何在某种集合中存储不同的窗口,然后按顺序显示它们吗?
答案 0 :(得分: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
分配一个随机数,并将w
分配给Window
。 (编译器将创建一个在后台描述此匿名类型的类,但您永远不需要直接处理它。)
Select Ordinal = l_random.Next(),
Window = w
按Ordinal
订购匿名类型的对象。如果两个Ordinal
是相同的,那么它将简单地一个接一个地放置(可能基于l_window的原始顺序,但我没有测试过它。)
Order By Ordinal
对于新近重新排序的列表中的每个匿名类型对象,选择分配给Window属性的对象。 LINQ足够聪明,可以选择值,而不是创建具有单个属性的匿名类型。
Select Window
然后IEnumerable(Of Window)
被分配到l_randomWindows
。
注意 IEnumerable表示的对象本身不是一个集合。编译器实际上会创建一个查询对象,直到您实际尝试从集合中检索项目时才会执行该查询对象(如
For
循环中所示)。此查询将一次又一次地执行,每次都返回不同排序的结果(因为每次都会调用l_random.Next()
)。如果您想获得稳定的收藏品,只需致电
l_randomWindows.ToList()
或l_randomWindows.ToArray()
并将结果分配给变量。