编辑:好的,现在我们已经有了一个清晰的略微组需求(虽然还远未明确的书面)最简单的方法很可能是:
var maxes = list.GroupBy(x => x.id2,
(key, xs) => xs.OrderByDescending(x => x.id1)
.First()
.value);
不幸的是LINQ并没有提供一个简单的方法获得“具有最大值的元素”(而不是最大值本身)。我在MoreLINQ的方法,它做到这一点,虽然,叫MaxBy
:
var maxes = list.GroupBy(x => x.id2,
(key, xs) => xs.MaxBy(x => x.id2).value);
原来的答复(由ID2分组,取最大值)
我回答假设你实际上意味着按id2
而不是id1
进行分组,您实际上想要12和87的结果而不是6和87.在这种情况下,您希望:
var maxes = list.GroupBy(x => x.id2, (id, xs) => xs.Max(x => x.value));
或(可能更容易理解):
var maxes = list.GroupBy(x => x.id2)
.Select(xs => xs.Max(x => x.value));
或者:
var maxes = list.GroupBy(x => x.id2, x => x.value)
.Select(values => values.Max());
或者:
var maxes = list.GroupBy(x => x.id2, // Key selector
x => x.value, // Element selector
(key, values) => values.Max()); // Result selector
甚至:
var maxes = list.GroupBy(x => x.id2)
.Select(xs => xs.Select(x => x.value).Max());
正如你所看到的,GroupBy
有很多重载:)
或者你可以使用查询表达式:
var maxes = from x in list
group x.value by x.id2 into values
select values.Max();
你不应该限制自己要么查询表达式或扩展方法版本 - 理解这两者很重要,所以你可以使用任何最合适的。
您还没有表达清楚你的问题在所有。 *为什么*你会期望结果是6和87?为什么当每行有不同的id1时,通过id1进行分组?如果你用id2进行分组会更有意义,但结果应该是12和87,而不是6和87.请花一些时间让你的问题清楚。 – 2013-04-07 18:28:40
但是'6 <12'和'87> 8';请解释。 – 2013-04-07 18:28:59
我想他希望按id2分组,并从每个组中选择最大值 – 2013-04-07 18:30:31