2013-03-21 72 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