我已经在各种StackOverflow答案中看到,通过执行类似的操作,我可以获得列表中的第N个最大元素
var nthFromTop = items.OrderByDescending().Skip(N-1).First();
但是,如果列表中没有重复项,这不是唯一可行的方法吗?如果列表包含重复项,是否有办法使用LINQ获取第N个最大元素(或元素集)?如果没有,那么在C#中最有效的方法是什么?
最佳答案
要获得等于第N个最大项目的所有项目的集合,您需要对项目进行分组,排序组,然后在N为正数时将N减少组大小。当N达到零时,您已击中包含第N个最大项目的组。
public static IEnumerable<T> Foo<T>(this IEnumerable<T> source, int n)
{
return source.GroupBy(x => x)
.OrderByDescending(group => group.Key)
.SkipWhile(group =>
{
n -= group.Count();
return n > 0;
})
.First();
}