2014-02-05 78 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