web-dev-qa-db-fra.com

Élément aléatoire de List <T> de LINQ SQL

J'utilise C# 3.5 et j'utilise actuellement Linq pour obtenir tous les utilisateurs d'une table d'utilisateurs et les mettre dans une liste.

Maintenant, je voudrais renvoyer un utilisateur aléatoire de cette liste. Quelle est la meilleure façon de procéder?

45
Kovu

Comme ça:

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

Utilisez ElementAt :

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

Pourquoi ne pas créer un assistant générique et/ou une extension?!

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

L'utilisation serait:

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

        var output = list.Random();
9
longda

pour Entity Framework ou Linq 2 Sql, peut utiliser cette méthode d'extension

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

Que diriez-vous quelque chose comme ça?

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

La classe Random peut être utilisée pour générer des nombres pseudo-aléatoires. Utilisez-le pour générer un nombre aléatoire dans la plage d'indices valides dans votre tableau ou votre liste.

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

Si vous voulez voir plus d'exemples, j'ai créé plusieurs extensions LINQ à orientation aléatoire et les ai publiées dans l'article Étendre LINQ avec des opérations aléatoires .

1
Jonathan Wood