trong C# .net 3.5 Tôi nhận được bởi Linq tất cả người dùng của tôi từ bảng người dùng của tôi.Phần tử ngẫu nhiên của Danh sách <T> từ LINQ SQL
Bây giờ tôi sẽ trả về một người dùng ngẫu nhiên từ danh sách này, cách thực hiện?
trong C# .net 3.5 Tôi nhận được bởi Linq tất cả người dùng của tôi từ bảng người dùng của tôi.Phần tử ngẫu nhiên của Danh sách <T> từ LINQ SQL
Bây giờ tôi sẽ trả về một người dùng ngẫu nhiên từ danh sách này, cách thực hiện?
Như thế này:
var rand = new Random();
var user = users[rand.Next(users.Count)];
Lưu ý: Trong mã thực 'var rand = new Random();' nên được khởi tạo ở một nơi khác để nó sẽ chỉ được gieo một lần. Nếu mã này được gọi nhiều lần liên tiếp nhanh chóng, các trường hợp mới của 'Random' có thể kết thúc bằng cách sử dụng cùng một hạt giống và do đó trả về cùng một giá trị khi gọi' Tiếp theo'. – Brian
Thật vậy, rand này có thể là 'tĩnh' –
Làm thế nào về một cái gì đó như thế này?
var users = GetUsers();
var count = user.Count();
var rand = new System.Random();
var randomUser = users.Skip(rand.Next(count)).FirstOrDefault();
Nếu đó là một 'IList
Khá đúng, nhưng cách câu hỏi được đặt phrased có rất nhiều chỗ cho sự mơ hồ. – ilivewithian
Sử dụng ElementAt
:
var rand = new Random();
var user = users.ElementAt(rand.Next(users.Count()));
cho Entity Framework hoặc LINQ 2 SQL, có thể sử dụng phương pháp mở rộng này
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
Tại sao không tạo ra một helper generic và/hoặc gia hạn ?!
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);
}
}
}
Cách sử dụng sẽ là:
var list = new List<int>() { 1, 2, 3, 4, 5 };
var output = list.Random();
Lớp Random
có thể được sử dụng để tạo số giả ngẫu nhiên. Sử dụng nó để tạo ra một số ngẫu nhiên trong phạm vi của các chỉ số hợp lệ vào mảng hoặc danh sách của bạn.
Random rand = new Random();
var user = Users[rand.Next(Users.Count)];
Nếu bạn muốn xem thêm ví dụ, tôi tạo ra một vài phần mở rộng ngẫu nhiên theo định hướng LINQ và công bố nó trong bài viết Extending LINQ with Random Operations.
bản sao có thể có của [LINQ: Cách nhận đối tượng ngẫu nhiên bằng LINQ] (http://stackoverflow.com/questions/3173718/linq-how-to-get-a-random-object-using-linq) – jfar