我已经在各种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();
}

07-28 09:19