2013-05-01 2 views
1

LINQ가 주어진 목록의 상위 n %를 선택할 수있는 방법을 찾으려고했습니다. 가장 가까운 필자는 TOP PERCENT SQL 문과 비슷하게 작동하지만 퍼센트를 지원하지 않는 take 문을 사용합니다. 나는 명백한 무엇인가 놓치고있다라고 확신한다. 그러나 나는 단지 그것을 볼 것 같지 않다. 그것은 것입니다 그합니다 (Count() 방법 사용) IEnumerable<T>와 함께 작동 할 수 있음을LINQ를 사용하여 목록의 상위 N %를 얻습니다.

public static IEnumerable<T> TakePercent<T>(this ICollection<T> source, double percent) 
{ 
    int count = (int)(source.Count * percent/100); 
    return source.Take(count); 
} 

참고 :하지만,

+1

http://stackoverflow.com/questions/470339/linq-version-of-top-percent?rq=1 – Patashu

+5

직접적인 방법은 없지만 'Count()'를 사용하여 총 항목 수를 확인할 수 있습니다 , 그리고 나서'Take()'를 사용하고, 매개 변수는'(desiredPercentage * totalItems)/100'이다. – dlev

답변

5

소스가 ICollection<T>이다 가정 (그리고 단지 IEnumerable<T>되지 않음), 당신은 그런 식으로 뭔가를 할 수 시퀀스를 두 번 열거하면 일반적으로 나쁜 것으로 간주됩니다.

+0

아마도이 경우'.ToList()'를 호출하는 것이 가장 좋습니다. :) – Khanzor

+0

@Khanzor, 반드시 좋은 생각은 아닙니다. 컬렉션의 수를 계산하는 것이 매우 저렴하지만 모든 콘텐츠를 검색하는 데 비용이 많이 드는 경우에는 어떻게해야합니까? 이러한 콜렉션의 예가 있습니다. [here] (http://www.codeproject.com/Articles/34405/WPF-Data-Virtualization) –

+0

.ToList() 호출에 대한 제안은 IEnumerable의 과부하입니다. :). 셀 수 (예 : select count (*) v. select *)보다 더 쉽게 반환 할 수있는 컬렉션의 예를 생각해 보면 알기 쉽습니다. 모호한 의견에 사과 드리겠습니다. – Khanzor

관련 문제