2011-01-06 11 views
34

のC#.net 3.5からの 私はLinqが私のユーザテーブルから私のすべてのユーザを取得します。 リストのランダム要素LINQのSQL

このリストからランダムなユーザーを返します。このよう

+2

[Linq:Linqを使用してランダムオブジェクトを取得する方法](http://stackoverflow.com/questions/3173718/linq-how-to-get-a-random-object-using-linq) – jfar

答えて

49

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

の可能な複製注意:実際のコードでは、 'var rand = new Random();'は他の場所で初期化され、一度しかシードされません。このコードが連続して複数回呼び出されると、 'Random'の新しいインスタンスは同じシードを使用して終了し、' Next'を呼び出すときに同じ値を返します。 – Brian

+1

確かに、このランドは静的である可能性があります –

0

どのようにこのようなものでしょうか?

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

'IList 'の場合、LINQは必要ありません。 – SLaks

+0

かなり正しいですが、質問の表現方法にはあいまいさがたくさんあります。 – ilivewithian

25

使用ElementAt:Entity Frameworkのか、LINQの2 SQLの

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

、ジェネリックヘルパーおよび/または拡張を作成しないのはなぜ、この拡張メソッド

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

を使用することができます!

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

使い方は次のようになります。

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

     var output = list.Random(); 
1

Randomクラスは、擬似乱数を生成するために使用することができます。有効なインデックスの範囲内で配列またはリストに乱数を生成するために使用します。

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

あなたはより多くの例を見たい場合は、私はいくつかのランダムな指向LINQの拡張機能を作成し、記事Extending LINQ with Random Operationsでそれを発表しました。

関連する問題