2011-01-06 6 views
34

in 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 : 엔티티 프레임 워크 또는 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에 발표했다.