LINQ SQL中List<T>的随机元素

57

我正在使用 C# 3.5,并且目前正在使用 Linq 从用户表中获取所有用户并将它们放入列表中。

现在我想从该列表返回一个随机用户。怎么做最好呢?

编辑:在此处找到它: 如何使用Linq获取随机对象

8个回答

81

像这样:

var rand = new Random();
var user = users[rand.Next(users.Count)];

19
注意:在真实的代码中,“var rand = new Random();”应该在其他地方初始化,这样它只会被种子化一次。如果此代码被快速连续调用多次,则新的“Random”实例可能会使用相同的种子,从而在调用“Next”时返回相同的值。 - Brian
4
确实,这个变量可以是 静态的 - Junior Mayhé
我认为用户集合是从零开始的,所以应该这样写:var user = users[rand.Next(users.Count-1)]; - Roman
1
@Roman 计数器-1不需要,rand.Next“返回一个小于指定最大值的非负随机整数”。 - 4imble

37

使用 ElementAt 方法:

var rand = new Random();
var user = users.ElementAt( rand.Next( users.Count() ) );

16
为什么不创建一个通用的帮助类或扩展?!
namespace My.Core.Extensions
{
    public static class EnumerableHelper<E>
    {
        private static Random r;

        static EnumerableHelper()
        {
            r = new Random();
        }

        public static T Random<T>(IEnumerable<T> input)
        {
            return input.ElementAt(r.Next(input.Count()));
        }

    }

    public static class EnumerableExtensions
    {
        public static T Random<T>(this IEnumerable<T> input)
        {
            return EnumerableHelper<T>.Random(input);
        }
    }
}

使用方法如下:

        var list = new List<int>() { 1, 2, 3, 4, 5 };

        var output = list.Random();

10

对于Entity Framework或Linq 2 Sql,可以使用这个扩展方法。

public static T RandomElement<T>(this IQueryable<T> q, Expression<Func<T,bool>> e)
{
   var r = new Random();
   q  = q.Where(e);
   return q.Skip(r.Next(q.Count())).FirstOrDefault();
}
// persons.RandomElement(p=>p.Age > 18) return a random person who +18 years old
// persons.RandomElement(p=>true) return random person, you can write an overloaded version with no expression parameter

3
这个怎么样?
var users = GetUsers();
var count = user.Count();
var rand = new System.Random();
var randomUser = users.Skip(rand.Next(count)).FirstOrDefault();

如果是 IList<T>,你不需要使用 LINQ。 - SLaks
非常正确,但问题的措辞存在很大的歧义空间。 - ilivewithian

2
list.OrderBy(x=> Guid.NewGuid()).Take(10)

这并不是被要求的内容 - 而且这样做非常低效。 - Frederik
OpenAI表示这是最好的方法来做到这一点。 - Ricardo Araújo

2
< p > Random 类可用于生成伪随机数。使用它来在有效索引范围内生成随机数以访问您的数组或列表。
Random rand = new Random();
var user = Users[rand.Next(Users.Count)];

如果您想查看更多示例,我创建了几个面向随机的LINQ扩展,并在文章《使用随机操作扩展LINQ》中发布。

0

并非所有情况都适用,但以下是我发现很方便的替代解决方案,因为我已经在我的项目中使用了Bogus

List<User> myUserList = _context.Users.ToList();

var _faker = new Faker("en");
User randomUser = _faker.Random.ListItem<User>(myUserList);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接