2014-06-27 19 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

相關問題