2014-06-27 102 views
1

我见过各种StackOverflow的答案,我可以做这样的事情如何使用LINQ从重复列表中获取第N大元素?

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

获取列表中的第N个最大的元素,但不会这只是工作,如果有列表中没有重复?如果列表包含重复项,有没有办法使用LINQ获取第N大元素(或元素集)?如果没有,那么在C#中最有效的方法是什么?

+0

因此,如果您有一套'{1,1,2,2,3,3,4,4}'并且将'N'设置为'2',您希望输出是什么?你想得到不同的值,然后得到第N大?你想得到的所有元素的集合等于第N大吗? – Servy

+0

对不起,不清楚 - 理想情况下,我希望所有元素的集合等于第N大 – ubuntunoob

+0

然后所有发布的答案都是错误的。 – Servy

回答

2

要获得所有项目的集合等于第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(); 
} 
+0

ahhhh所以你注意到了例外.... :)那就是我的意思在我的回答中关于你放入你的评论... – terrybozzio

0

如果你想避免重复,如何使用

3

如果你想获得一个集合中的所有元素,使用的GroupBy

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

根据[OP的澄清他所要求的](http://stackoverflow.com/questions/24455950/how-do-i-get-the-nth-largest-element-from-a-list-with -duplicates-using-linq?noredirect = 1#comment37846813_24455950)你的代码不会产生正确的输出。 – Servy

+0

@Servy我可能错了,但ElementAt()方法如何不返回适当的组? OFC。除了事实,它应该有参数1而不是2. – Tarec

+1

@Tarec如果'N'是'2',它应该返回等于第二大项目的项目集合。样本输入中的第二大项是'4',所以它应该返回四组(第一组)。 – Servy

0

如果你想获得属于第N个最大的,如果有重复的所有值做到这一点:

编辑

List<int> ints = new List<int>() 
{ 
    1,2,5,8,12,34,12,52,34 
}; 

int NthLargest = 1; 
var queryresult = ints 
        .GroupBy(e => e) 
        .OrderByDescending(f => f.Count()) 
        .ThenByDescending(k => k.Key) 
        .ElementAt(NthLargest - 1); 
+0

根据[OP的澄清他所要求的](http://stackoverflow.com/questions/24455950/how-do-i-get-the-nth-largest-element-from-a-list-with -duplicates-using-linq?noredirect = 1#comment37846813_24455950)你的代码不会产生正确的输出。 – Servy

+0

不,它根本不会做同样的事情。只要尝试在这里使用的一些示例数据集上执行它就可以亲自查看。 – Servy

+0

我现在明白了,只是意识到了自己想要的东西,然后在我的代码中(是的,是的,我知道它现在没有任何问题),它只是按顺序排列f.Count()而不是f.Key.And,你确定在你的代码在顺序下降你不想把它放在? – terrybozzio

相关问题