2013-03-21 76 views
0

我对VB.Net相当陌生。VB.Net:wpf窗口的集合

我在写一个类似于调查的程序。 WPF窗口依次按顺序弹出问题。现在,我的客户要求随机化某些窗口的订单。我以为我可以有一个窗口集合,并以随机顺序呈现这些窗口。但是,我没有找到任何信息。

有人可以告诉我如何在某种集合中存储不同的窗口,然后按顺序显示它们吗?

回答

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类型的对象。如果两个Ordinal是相同的,那么它将简单地依次放置(可能基于l_window的原始顺序,尽管我没有测试过它)。

    Order By Ordinal 
    
  • 对于刚重新排序列表中的每个匿名类型的对象,选择分配给窗口属性的对象。 LINQ很聪明,可以选择值,而不是创建一个具有单个属性的匿名类型。

    Select Window 
    
  • IEnumerable(Of Window)然后分配给l_randomWindows

注意,通过IEnumerable的表示的对象是不是其本身的集合。编译器实际上会创建一个查询对象,在您实际尝试从集合中检索一个项目(如在For循环中)之前,该查询对象不会被执行。该查询将一次又一次地执行,每次返回不同的有序结果(因为每次都会调用l_random.Next())。

如果你想获得一个稳定的收集,只需拨打l_randomWindows.ToList()l_randomWindows.ToArray()并将结果分配给一个变量。

+0

谢谢。我不熟悉LINQ。以上是否意味着: 1.选择随机数字和窗口的行 2.按这些随机数排序这些行 3.按当前顺序选择所有窗口 4.显示所有窗口。 Can l_random.Next()会产生两个相同的数字吗?那么会发生什么?谢谢。 – vlr 2013-03-21 21:23:43

+0

@vlr - 查看更新。 – JDB 2013-03-21 21:57:04

+0

太好了,非常感谢。 – vlr 2013-03-21 22:26:03