C# 如何使用LINQ从包含重复项的列表中获取第n个最大元素?

C# 如何使用LINQ从包含重复项的列表中获取第n个最大元素?,c#,linq,C#,Linq,我在各种StackOverflow答案中看到,我可以通过如下操作获得列表中第n个最大的元素 var nthFromTop = items.OrderByDescending().Skip(N-1).First(); 但这不是只有在列表中没有重复项的情况下才有效吗?如果列表包含重复项,是否有方法使用LINQ获取第n个最大元素(或元素集)?如果不是,在C#?中最有效的方法是什么?如果要避免重复,使用分组方式如何?如果要获得一组所有元素,请使用分组方式 var items = new[] {1,

我在各种StackOverflow答案中看到,我可以通过如下操作获得列表中第n个最大的元素

var nthFromTop = items.OrderByDescending().Skip(N-1).First();

但这不是只有在列表中没有重复项的情况下才有效吗?如果列表包含重复项,是否有方法使用LINQ获取第n个最大元素(或元素集)?如果不是,在C#?

中最有效的方法是什么?如果要避免重复,使用分组方式如何?

如果要获得一组所有元素,请使用分组方式

 var items = new[] {1, 1, 2, 2, 3, 4, 4};
 var thirdLargest = items
   .GroupBy(x => x)
   .OrderByDescending(group => group.Key)
   .ElementAt(2);

如果要获取第n个最大值(如果存在重复项),请执行以下操作:

编辑

List ints=new List()
{
1,2,5,8,12,34,12,52,34
};
int=1;
var queryresult=ints
.GroupBy(e=>e)
.OrderByDescending(f=>f.Count())
.然后按降序(k=>k.Key)
.ElementAt(第n-1页);

要获得等于第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();
}
公共静态IEnumerable Foo(此IEnumerable源代码,int n)
{
返回source.GroupBy(x=>x)
.OrderByDescending(组=>group.Key)
.SkipWhile(组=>
{
n-=group.Count();
返回n>0;
})
.First();
}

因此,如果您有一组
{1,1,2,2,3,3,4,4}
并将
N
设置为
2
您希望输出是什么?是否要获取不同的值,然后获取第n个最大值?你想让所有元素的集合等于第n个最大元素吗?很抱歉不清楚-理想情况下,我希望所有元素的集合等于第n个最大元素,那么所有发布的答案都是错误的。如果我获得第n个最大元素,那么我可以编写另一个查询,以使所有元素都等于该元素。有更好的办法吗?有。我发布了一个答案。根据您的代码,没有生成正确的输出。@Servy我可能错了,但是ElementAt()方法怎么没有返回正确的组呢?Ofc。除此之外,它应该有参数1而不是2。@Tarec如果
N
2
它应该返回与第二大项相等的项集。示例输入中的第二大项是
4
,因此它应该返回四个一组(第一组)。根据您的代码,不会产生正确的输出。不,它根本不会做相同的事情。只要试着在这里使用的一些示例数据集上执行它就可以了。我现在得到了它,刚刚意识到op想要什么,然后在我的代码中(是的,是的,我知道它现在不重要)它只是放在orderbydescending f.Count()中而不是f.Key.你确定在你的代码中按降序排列你不想把它放进去吗?你的代码仍然是错误的,我很确定我的代码就是我想要的。他不想要第n个最大的团体。他希望找到序列中第n个最大的项,包括重复项和全部项,然后找到与该项相等的所有项集。我的解决方案只是在一个过程中执行一个功能等效的操作。不,这不是你的假设,而不是尝试op想要的。例如,这个序列{1,2,2,2,2,3,12,12,34,34,34},第2个最大的是序列{34,34,34},如果不是这样,那么前面的代码是正确的,它会选择{12,12}.ahhh所以你注意到了一个例外……)这就是我在回答中关于你把你的。。。
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();
}