来自LINQ SQL的List <t>的随机元素</t>

时间:2011-01-06 13:33:58

标签: c# .net linq random

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

现在我想从该列表中返回一个随机用户。这样做的最佳方式是什么?

7 个答案:

答案 0 :(得分:60)

像这样:

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

答案 1 :(得分:26)

使用ElementAt

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

答案 2 :(得分:9)

为什么不创建通用助手和/或扩展名?!

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();

答案 3 :(得分:8)

对于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

答案 4 :(得分:3)

这样的事情怎么样?

var users = GetUsers();
var count = user.Count();
var rand = new System.Random();
var randomUser = users.Skip(rand.Next(count)).FirstOrDefault();

答案 5 :(得分:1)

Random类可用于生成伪随机数。用它来生成数组或列表中有效索引范围内的随机数。

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

如果您想查看更多示例,我创建了几个面向随机的LINQ扩展,并将其发布在文章Extending LINQ with Random Operations中。

答案 6 :(得分:0)

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

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

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