不适用Max():序列不包含任何元素



我有一个列表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();

相关内容

最新更新