2013-11-23 2 views

답변

4

이 시도 : 당신이 어떤 연기 쿼리를 원하는 경우

var rand = new Random(); 
var top30percent = myCollection.OrderBy(x=> rand.Next(myCollection.Count)) 
           .Take((int)(0.3f*myCollection.Count)).ToList(); 

당신은 ToList()을 제거 할 수 있습니다.

+0

나는이 대답 +1을 정말로 좋아합니다. – Tarik

+0

그러나이 문제는 동일한 항목을 두 번 이상 선택할 수 있다는 가능성이 있습니다. OP가 필요하다면 괜찮을 수도 있고 아닐 수도 있습니다. – Icemanind

+0

니스! 예, 동일한 항목이 두 번 이상 선택되지 않도록해야합니다. – My2ndLovE

2

질문에 두 부분이 있습니다. 먼저 무작위로 항목을 선택하려면 컬렉션을 셔플해야합니다. 셔플하려면 Fisher-Yates 셔플로 제대로하거나 그냥 무작위 생성기를 사용하여 아이템을 주문할 수 있습니다.

피셔 - 예이츠 셔플 this popular answer에서 온다 :

public static IList<T> Shuffle<T>(this IList<T> list) 
{ 
    Random rng = new Random(); 
    int n = list.Count; 
    while (n > 1) { 
     n--; 
     int k = rng.Next(n + 1); 
     T value = list[k]; 
     list[k] = list[n]; 
     list[n] = value; 
    } 

    return list; 
} 

을 그러나, 나는 우리가 참여할 깨끗하게 사용할 수 있습니다 목록을 반환하고 있습니다. 또한 실제로 깔끔하게 정리할 필요가없는 경우 i => random.Next() 또는 i => Guid.NewGuid()과 함께 간단한 OrderBy을 람다 식으로 사용할 수 있습니다.

둘째, 일단 섞은 후에는 일정 비율의 항목을 가져와야합니다. Take LINQ 메서드를 사용하면이 작업을 간단하게 수행 할 수 있습니다. ,

마지막으로
public static IEnumerable<int> TakePercentage(this IList<int> list, double percentage) 
{ 
    return list.Take((int)(percentage * list.Count)); 
} 

이 그것을 사용하기 :

10 진수를 수신 선호하는 경우
public static IEnumerable<int> TakePercentage(this IList<int> list, int percentage) 
{ 
    return list.Take(percentage * list.Count/100); 
} 

(예 : 0.3) 직접 : 셔플 방법처럼

, 당신은 확장 방법으로 그것을 만들 수 있습니다 그것은 아주 간단합니다 :

var thirtyPercent = myCollection.Shuffle().Take(30); 
+0

니스. 그러나 동일한 항목이 두 번 이상 선택됩니다. 맞습니까? – My2ndLovE

관련 문제