编辑:好的,现在我们有了更清晰的一组要求(尽管还远未写清楚),最简单的方法可能是:
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();
您不应该将自己限制在查询表达式或扩展方法版本 - 了解两者很重要,因此您可以使用最合适的任何内容。