web-dev-qa-db-ja.com

LINQ SQLのList <T>のランダム要素

私はC# 3.5を使用しており、現在Linqを使用して、ユーザーテーブルからすべてのユーザーを取得し、それらをリストに入れています。

次に、そのリストからランダムなユーザーを返したいと思います。それを行う最善の方法は何ですか?

45
Kovu

このような:

var Rand = new Random();
var user = users[Rand.Next(users.Count)];
62
SLaks

ElementAt を使用します。

var Rand = new Random();
var user = users.ElementAt( Rand.Next( users.Count() ) );
26
Danko Durbić

汎用のヘルパーや拡張機能を作成してみませんか?!

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

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
8
Cihan Yakar

このようなものはどうですか?

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

Randomクラスを使用して、擬似乱数を生成できます。これを使用して、配列またはリストに有効なインデックスの範囲内で乱数を生成します。

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

他の例をご覧になりたい場合は、ランダム指向のLINQ拡張機能をいくつか作成し、記事 ランダム操作によるLINQの拡張 で公開しました。

1
Jonathan Wood