2011-01-06 14 views
34

w języku C# .net 3.5 Dostaję przez Linq wszystkich moich użytkowników z mojego stołu użytkownika.Losowy element listy <T> od LINQ SQL

Teraz zwrócę losowego użytkownika z tej listy, jak to zrobić?

+2

możliwy duplikat [Linq: Jak uzyskać losowy obiekt za pomocą Linq] (http://stackoverflow.com/questions/3173718/linq-how-to-get-a-random-object-using-linq) – jfar

Odpowiedz

49

Jak to:

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

Uwaga: W prawdziwym kodzie 'var rand = new Random();' powinno być zainicjalizowane gdzie indziej, tak aby było ono zasiane tylko raz. Jeśli ten kod jest wywoływany wiele razy w krótkich odstępach czasu, nowe instancje 'Random' mogą skończyć używając tego samego materiału siewnego i tym samym zwracając tę ​​samą wartość podczas wywoływania' Next'. – Brian

+1

Rzeczywiście, ten rand mógłby być "statyczny" –

0

Jak o czymś takim?

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

Jeśli jest to 'IList ', nie potrzebujesz LINQ. – SLaks

+0

Całkiem słusznie, ale sposób sformułowania pytania jest dużo miejsca na dwuznaczność. – ilivewithian

25

Zastosowanie ElementAt:

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

dla Entity Framework lub Linq 2 SQL, można użyć tej metody wydłużania

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 
7

Dlaczego nie stworzyć ogólny pomocnika i/lub rozszerzenia ?!

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

użycia może być:

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

     var output = list.Random(); 
1

Klasa Random mogą być wykorzystywane do generowania liczb pseudolosowych. Użyj go, aby wygenerować liczbę losową w zakresie prawidłowych indeksów do swojej tablicy lub listy.

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

Jeśli chcesz zobaczyć więcej przykładów, stworzyłem kilka rozszerzeń losowo zorientowanych LINQ i opublikował je w artykule Extending LINQ with Random Operations.