2011-01-06 35 views
34

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?

+2

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

Trả lời

49

Như thế này:

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

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

+1

Thật vậy, rand này có thể là 'tĩnh' –

0

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(); 
+0

Nếu đó là một 'IList ', bạn không cần LINQ. – SLaks

+0

Khá đúng, nhưng cách câu hỏi được đặt phrased có rất nhiều chỗ cho sự mơ hồ. – ilivewithian

25

Sử dụng ElementAt:

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

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 
7

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(); 
1

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.

Các vấn đề liên quan