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ć?
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ć?
Jak to:
var rand = new Random();
var user = users[rand.Next(users.Count)];
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
Rzeczywiście, ten rand mógłby być "statyczny" –
Jak o czymś takim?
var users = GetUsers();
var count = user.Count();
var rand = new System.Random();
var randomUser = users.Skip(rand.Next(count)).FirstOrDefault();
Jeśli jest to 'IList
Całkiem słusznie, ale sposób sformułowania pytania jest dużo miejsca na dwuznaczność. – ilivewithian
Zastosowanie ElementAt
:
var rand = new Random();
var user = users.ElementAt(rand.Next(users.Count()));
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
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();
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.
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