2014-02-05 75 views
0

我有一組問題,其中每個問題都有一個「Group」屬性。LINQ group by並從每個組中選擇隨機元素

我想從每個組中提取一個包含一個隨機問題的集合。

我已經試過以下LINQ查詢:

_questions = _questions.GroupBy(q => q.Group) 
         .Select(g => g.ElementAt(new Random().Next(0, g.Count()))) 
         .ToList(); 

但它看起來像random.Next值只計算一次,所以同樣生成的值對每個組使用?

這可能是它應該如何工作(或者我錯過了某些東西),但是如果我想從每個組中選擇一個元素時爲每個組生成一個新的隨機數,我該怎麼辦?

顯然這可以解決「困難的方式」,但我可以用LINQ查詢嗎?

問候

回答

3

這是simple.Just定義查詢之外的隨機實例:

Random rnd = new Random(); 

然後用這個rnd查詢裏面:

_questions = _questions.GroupBy(q => q.Group) 
      .Select(g => g.ElementAt(rnd.Next(0, g.Count()))).ToList(); 
+0

嘿,那很容易。謝謝:) – mat

2

我覺得選擇的答案雖然給出了一個合理的解決方案,但沒有說明手頭的問題,所以我提供了這個描述。

發生什麼事是您的代碼只運行Next(...)一次,它運行多次new Random().Next(...)。這意味着每個隨機數來自一個新的Random實例,這在許多先前的問題中是引起關注的原因(例如this question(參見Guffa的回答))。這似乎總是得到相同的結果,因爲......

  • Random情況下被時創建
  • 他們在緊密循環創建時播種,所以這一切都發生迅速

......這意味着種子總是相同的,所以你總是生成相同的隨機數。

Selman22提供的答案處理這個整齊,因爲它只創建一個Random實例,所以它只播種一次,給你隨機數,當你打電話給Next(...)

+0

謝謝你詳細說明這一點。我實際上想知道爲什麼新的Random實例方法不起作用,所以感謝解釋。 – mat