我見過各種StackOverflow的答案,我可以做這樣的事情如何使用LINQ從重複列表中獲取第N大元素?
var nthFromTop = items.OrderByDescending().Skip(N-1).First();
獲取列表中的第N個最大的元素,但不會這只是工作,如果有列表中沒有重複?如果列表包含重複項,有沒有辦法使用LINQ獲取第N大元素(或元素集)?如果沒有,那麼在C#中最有效的方法是什麼?
我見過各種StackOverflow的答案,我可以做這樣的事情如何使用LINQ從重複列表中獲取第N大元素?
var nthFromTop = items.OrderByDescending().Skip(N-1).First();
獲取列表中的第N個最大的元素,但不會這只是工作,如果有列表中沒有重複?如果列表包含重複項,有沒有辦法使用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();
}
ahhhh所以你注意到了例外.... :)那就是我的意思在我的回答中關於你放入你的評論... – terrybozzio
如果你想避免重複,如何使用組?
如果你想獲得一個集合中的所有元素,使用的GroupBy
var items = new[] {1, 1, 2, 2, 3, 4, 4};
var thirdLargest = items
.GroupBy(x => x)
.OrderByDescending(group => group.Key)
.ElementAt(2);
根據[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
@Servy我可能錯了,但ElementAt()方法如何不返回適當的組? OFC。除了事實,它應該有參數1而不是2. – Tarec
@Tarec如果'N'是'2',它應該返回等於第二大項目的項目集合。樣本輸入中的第二大項是'4',所以它應該返回四組(第一組)。 – Servy
如果你想獲得屬於第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);
根據[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
不,它根本不會做同樣的事情。只要嘗試在這裏使用的一些示例數據集上執行它就可以親自查看。 – Servy
我現在明白了,只是意識到了自己想要的東西,然後在我的代碼中(是的,是的,我知道它現在沒有任何問題),它只是按順序排列f.Count()而不是f.Key.And,你確定在你的代碼在順序下降你不想把它放在? – terrybozzio
因此,如果您有一套'{1,1,2,2,3,3,4,4}'並且將'N'設置爲'2',您希望輸出是什麼?你想得到不同的值,然後得到第N大?你想得到的所有元素的集合等於第N大嗎? – Servy
對不起,不清楚 - 理想情況下,我希望所有元素的集合等於第N大 – ubuntunoob
然後所有發佈的答案都是錯誤的。 – Servy