Casuale elemento della Lista<T> da LINQ, SQL

Sto usando C# 3.5 e attualmente sto utilizzando Linq per ottenere tutti gli utenti da una tabella utente e metterli in una lista.

Ora vorrei tornare un utente casuale dall’elenco. Qual è il modo migliore per procedere?

InformationsquelleAutor Kovu | 2011-01-06

 

6 Replies
  1. 62

    Come questo:

    var rand = new Random();
    var user = users[rand.Next(users.Count)];
    • Nota: Nel codice reale var rand = new Random(); deve essere inizializzato da qualche altra parte in modo che sarà solo seminato una volta. Se questo codice viene chiamato più volte in rapida successione, le nuove istanze di Random può finire con lo stesso seme e quindi restituisce lo stesso valore quando si chiama Next.
    • Questo, infatti, il rand potrebbe essere static
    • Credo utenti di raccolta è a base zero e quindi dovrebbe essere come: var user = utenti[rand.Successivo(gli utenti.Count-1)];
  2. 9

    Perché non creare un helper generico e/o estensione?!

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

    Utilizzo sarebbe:

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

    per Entity Framework o Linq 2 Sql, è possibile utilizzare questo metodo di estensione

    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

    Come a qualcosa del genere?

    var users = GetUsers();
    var count = user.Count();
    var rand = new System.Random();
    var randomUser = users.Skip(rand.Next(count)).FirstOrDefault();
    • Se si tratta di un IList<T>, non hai bisogno di LINQ.
    • Tutto giusto, ma il modo in cui la domanda è stata formulata, c’è un sacco di spazio per ambiguità.
  5. 1

    Il Random classe può essere utilizzata per generare numeri pseudo-casuali. Utilizzare per generare un numero casuale nell’intervallo di validità, indici in array o di un elenco.

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

    Se volete vedere altri esempi, ho creato diverse casuale-oriented LINQ estensioni e pubblicato nell’articolo Estendendo LINQ con Casuale Operazioni.

Lascia un commento