我见过各种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