2011-01-06 20 views
34

Listesinden Listesinin rasgele öğesi. Linq kullanıcı kullanıcılarımdan tüm kullanıcılarıma erişiyorum. C# .net 3.5'de LINQ SQL

Şimdi rastgele bir kullanıcıyı bu listeden nasıl döndüreceğim, nasıl yapmalı? Bunun gibi

+2

[Linq: Linq kullanarak Rastgele Bir Nesne Nasıl Kullanılır] 'ın olası kopyası (http://stackoverflow.com/questions/3173718/linq-how-to-get-a-random-object-using-linq) – jfar

cevap

49

:

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

Not: Gerçek kodda 'var rand = yeni Random();' başka bir yerde başlatılmalıdır, böylece yalnızca bir kez ekilebilir. Bu kod, hızlı bir şekilde art arda birden fazla kez çağrılırsa, "Random" in yeni örnekleri, aynı tohumu kullanarak sonlanabilir ve böylece "Next" (İleri) çağrılırken aynı değere dönülebilir. – Brian

+1

Gerçekten de, bu rand, "statik" –

0

Nasıl böyle bir şey?

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

olabilir. "IList " ise, LINQ'ye ihtiyacınız yoktur. – SLaks

+0

Oldukça doğru, ama soru cümlecik yolunda belirsizlik için çok yer var. – ilivewithian

25

Kullanım ElementAt: Varlık Framework veya Linq 2 Sql için

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

, genel bir yardımcı ve/veya uzantısı oluşturmak değil neden bu uzatma yöntemi

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

kullanabilirsiniz ?!

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

Kullanım olacaktır: sahte-rasgele sayılar üretmek için

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

     var output = list.Random(); 
1

Random sınıfı kullanılabilir. Geçerli indeksler aralığında dizi veya listenize rastgele bir sayı oluşturmak için kullanın. Daha fazla örnek görmek istiyorsanız

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

, birkaç rastgele odaklı LINQ uzantıları oluşturulan ve maddeye Extending LINQ with Random Operations bunu yayınladı.