如何有效地从iquerable中检索随机元素列表

本文关键字:检索 随机 元素 列表 iquerable 有效地 | 更新日期: 2023-09-27 18:05:08

我看到了以下内容:

list的随机元素

我现在要做的——得到三个随机元素——是这样的:

var user1 = users.ElementAt( rand.Next( users.Count() ) );
var user2 = users.Where(u => !u.Equals(user1)).ElementAt( rand.Next( users.Count() ) );
var user3 = users.Where(u => !u.Equals(user1) && !u.Equals(user2)).ElementAt( rand.Next( users.Count() ) );

但这显然是笨重和低效的。如何才能优雅而高效地访问数据库?

编辑:根据下面的答案,我做了如下的扩展方法:

    public static IQueryable<T> SelectRandom<T>(this IQueryable<T> list, int count) {
        return list.OrderBy(_ => Guid.NewGuid()).Take(count);
    }    
    var result = users.SelectRandom(3);

但是对于大型数据集来说,这似乎是低效的。另一个建议是采取IQueryable的.Count(),选择n个随机数落在该结果中,然后用所选的随机索引向数据库发送查询…但是Count()在这里可能很贵。

如何有效地从iquerable中检索随机元素列表

下面应该可以工作:

users.OrderBy(_ => Guid.NewGuid()).Take(3)

从users表中检索前3个元素,同时按每次不同的值对它们排序。

与AD相比。净的回答. .你需要一个随机生成的用户名列表。它没有建议这样做