如何合并三个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
相关产品推荐
相关产品推荐

