나는 100 개 항목을 말합니다.ASP.NET 컬렉션에서 항목을 선택하십시오. 백분율로
Collection<int> myCollection = new Collection<int>();
for(int i; i <= 100; i++)
{
myCollection .Add(i);
}
이 컬렉션에서 백분율 (예 : 30 %)로 항목을 임의로 선택할 수 있습니까?
나는 100 개 항목을 말합니다.ASP.NET 컬렉션에서 항목을 선택하십시오. 백분율로
Collection<int> myCollection = new Collection<int>();
for(int i; i <= 100; i++)
{
myCollection .Add(i);
}
이 컬렉션에서 백분율 (예 : 30 %)로 항목을 임의로 선택할 수 있습니까?
이 시도 : 당신이 어떤 연기 쿼리를 원하는 경우
var rand = new Random();
var top30percent = myCollection.OrderBy(x=> rand.Next(myCollection.Count))
.Take((int)(0.3f*myCollection.Count)).ToList();
당신은 ToList()
을 제거 할 수 있습니다.
질문에 두 부분이 있습니다. 먼저 무작위로 항목을 선택하려면 컬렉션을 셔플해야합니다. 셔플하려면 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);
니스. 그러나 동일한 항목이 두 번 이상 선택됩니다. 맞습니까? – My2ndLovE
나는이 대답 +1을 정말로 좋아합니다. – Tarik
그러나이 문제는 동일한 항목을 두 번 이상 선택할 수 있다는 가능성이 있습니다. OP가 필요하다면 괜찮을 수도 있고 아닐 수도 있습니다. – Icemanind
니스! 예, 동일한 항목이 두 번 이상 선택되지 않도록해야합니다. – My2ndLovE