LINQ group by并从每个组中选择随机元素

时间:2014-02-05 12:36:55

标签: c# linq

我有一组问题,每个问题都有一个“组”属性。

我想从每个组中提取一个包含一个随机问题的集合。

我尝试了以下LINQ查询:

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

但它看起来像random.Next值只计算一次,所以每组使用相同的生成值?

这可能是它应该如何工作(或者我缺少某些东西),但如果我想在从该组中选择一个元素时为每个组生成一个新的随机数,我该怎么办?

显然这可以通过“艰难的方式”解决,但我可以使用LINQ查询吗?

此致

2 个答案:

答案 0 :(得分:3)

这很简单。只需在查询之外定义随机实例:

Random rnd = new Random();

然后在查询中使用此rnd

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

答案 1 :(得分:2)

我觉得所选择的答案虽然给出了合理的解决方案,但并没有说明手头的问题,所以我提供了这种描述。

发生的事情是您的代码仅运行Next(...)一次,它多次运行new Random().Next(...)。这意味着每个随机数来自一个新的Random实例,这在以前的许多问题中引起了关注(例如this question(参见Guffa的答案))。这看起来总是产生相同的结果,因为......

  • 按创建时间播种的新Random个实例
  • 它们是在紧密循环中创建的,因此一切都很快发生

...意味着种子总是相同的,所以你总是生成相同的随机数。

Selman22提供的答案处理这个问题很简单,因为它只会创建一个Random个实例,所以它只播种一次,为您提供调用Next(...)时所需的随机数字。

相关问题