不适用Max():序列不包含任何元素
本文关键字:包含任 何元素 元素 Max 不适用 | 更新日期: 2023-09-27 18:08:34
我有一个列表list
,其中的项目如下
ElementA: Number=1, Version=1
ElementB: Number=1, Version=2
ElementC: Number=1, Version=3 <-
ElementD: Number=2, Version=1
ElementE: Number=2, Version=2 <-
ElementF: Number=3, Version=1 <-
,我想在具有相同Number
的项目的组中选择具有最高Version
的所有项目。(见上面的箭头)
我想使用查询,所以我试过这个:
var result = from a in list where a.Version >=
(from b in list where b.Number == a.Number && b != a select b.Version).Max() select a;
如果具有相同Number
的每一组项目由至少2个元素组成,则工作正常,但如果内部查询不包含元素,则会抛出InvalidOperationException。
我如何重写查询来得到我想要的?我将感激你的每一个提示。: -)
这应该可以做到这一点,但如果不自己复制数据,我无法测试它:
var result =
list.GroupBy(x => x.Number)
.Select(gr =>
gr.OrderByDescending(x => x.Version)
.First());
正如Henrik注意到的那样,这只会为您提供一个项目-我没有看到获得更多的理由,因为项目似乎只由两个字段组成,但这很容易处理-只需为版本添加另一个组:
var result =
list.GroupBy(x => x.Number)
.Select(gr =>
gr.GroupBy(x => x.Version)
.OrderByDescending(gr2 => gr2.Key)
.Select(gr => gr.ToArray()));
这应该导致数组的最大版本的枚举-但我不能再测试,所以可能会有语法或语义错误,但缩进应该是清晰的,错误很容易删除。
听起来你想先按数字分组,然后按版本排序,最后一个条目:
var result = from entry in list
group entry by entry.Number into g
select g.OrderBy(x => x.Version).Last();
或者避免实际排序,如果您不介意创建一个新条目:
var result = from entry in list
group entry by entry.Number into g
select new Entry { Number = g.Key,
Version = g.Max(x => x.Version) };
编辑:按照Carsten的方法使用OrderByDescending
来代替,可以避免迭代到最后一个条目:
var result = from entry in list
group entry by entry.Number into g
select g.OrderByDescending(x => x.Version).First();
直接删除&& b != a
部分
像这样?
var result = from e in elements
group e by e.Number into eGroup
select eGroup.OrderByDescending(x => x.Version).First();