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

Kov*_*ovu 46 .net c# linq random

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

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

SLa*_*aks 62

像这样:

var rand = new Random();
var user = users[rand.Next(users.Count)];
Run Code Online (Sandbox Code Playgroud)

  • 注意:在实际代码中`var rand = new Random();`应该在其他地方初始化,以便它只被播种一次.如果快速连续多次调用此代码,则"Random"的新实例可能最终使用相同的种子,因此在调用"Next"时返回相同的值. (14认同)
  • 事实上,这个兰特可以是“静态的” (4认同)

Dan*_*bić 27

用途ElementAt:

var rand = new Random();
var user = users.ElementAt( rand.Next( users.Count() ) );
Run Code Online (Sandbox Code Playgroud)


lon*_*gda 10

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

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

用法是:

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

        var output = list.Random();
Run Code Online (Sandbox Code Playgroud)


Cih*_*kar 9

对于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
Run Code Online (Sandbox Code Playgroud)