You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并三个IEnumerable<Application>列表并提取各Id的最高Version与Status

问题描述

定义了如下Application类:

public class Application
{
    public int Id { get; set; }
    public int Version { get; set; }
    public int Status { get; set; }
}

拥有三个IEnumerable<Application>列表:

IEnumerable<Application> applications1 = new List<Application>
{
    new Application {Id = 1, Version = 1, Status = 1},
    new Application {Id = 2, Version = 1, Status = 1},
    new Application {Id = 3, Version = 3, Status = 1}
};

IEnumerable<Application> applications2 = new List<Application>
{
    new Application {Id = 1, Version = 2, Status = 2},
    new Application {Id = 2, Version = 2, Status = 2},
    new Application {Id = 3, Version = 1, Status = 0}
};

IEnumerable<Application> applications3 = new List<Application>
{
    new Application {Id = 1, Version = 5, Status = 1},
    new Application {Id = 2, Version = 0, Status = 1},
    new Application {Id = 3, Version = 6, Status = 1}
};

期望生成结果列表,每个Id对应Version和Status的最大值:

IEnumerable<Application> applications4 = new List<Application>
{
    new Application {Id = 1, Version = 5, Status = 2},
    new Application {Id = 2, Version = 2, Status = 2},
    new Application {Id = 3, Version = 6, Status = 1}
};

即合并后的列表中,每个Id对应的项需同时取Version和Status的最大值。现有LINQ代码仅能提取最高Version,不清楚如何同时处理两个属性:

IEnumerable<Application> applications4 = applications1
    .Concat(applications2)
    .Concat(applications3)
    .GroupBy(a => a.Id)
    .Select(g => g.Aggregate((acc, curr) => acc.Version > curr.Version ? acc: curr ))
    .ToList();

需要修改代码实现需求。

解决方案

不需要用Aggregate筛选单个对象,因为需求是两个属性各自取最大值,而非找同时拥有最大Version和最大Status的原对象。可以直接对分组后的集合分别计算Version和Status的最大值,然后创建新的Application实例:

IEnumerable<Application> applications4 = applications1
    .Concat(applications2)
    .Concat(applications3)
    .GroupBy(a => a.Id)
    .Select(g => new Application 
    {
        Id = g.Key,
        Version = g.Max(item => item.Version),
        Status = g.Max(item => item.Status)
    })
    .ToList();

代码说明

  • 合并集合:通过Concat依次合并三个IEnumerable<Application>集合,得到所有应用的完整列表。
  • 按Id分组:使用GroupBy(a => a.Id)将相同Id的应用归为一组。
  • 计算最大值并生成新对象:对每个分组,分别调用Max(item => item.Version)和Max(item => item.Status)获取对应属性的最大值,然后创建包含该Id、最大Version和最大Status的新Application对象。

这种方式直接满足需求,逻辑清晰且易于维护,避免了Aggregate只能选取单个原对象的局限性。

内容的提问来源于stack exchange,提问作者Roger Uhlin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 13:35:09