在C#中合并两个对象列表:按Code和Type累加Count值
在C#中合并两个MyObject列表并按Code+Type匹配相加Count值
假设我们已经从SQL Server获取到两个MyObject类型的列表resultSetA和resultSetB,需要将Code和Type完全匹配的对应条目Count值相加,得到和示例一致的合并结果。
先定义测试数据(模拟从数据库读取的结果)
public class MyObject { public string Code; public string Type; public int Count; } // 模拟resultSetA var resultSetA = new List<MyObject> { new MyObject { Code = "ABC", Type = "1", Count = 10 }, new MyObject { Code = "ABC", Type = "2", Count = 20 }, new MyObject { Code = "DEF", Type = "3", Count = 30 }, new MyObject { Code = "DEF", Type = "1", Count = 11 }, new MyObject { Code = "DEF", Type = "2", Count = 12 }, new MyObject { Code = "XYZ", Type = "3", Count = 13 }, new MyObject { Code = "XYZ", Type = "1", Count = 20 }, new MyObject { Code = "XYZ", Type = "3", Count = 21 } }; // 模拟resultSetB var resultSetB = new List<MyObject> { new MyObject { Code = "ABC", Type = "1", Count = 11 }, new MyObject { Code = "ABC", Type = "2", Count = 30 }, new MyObject { Code = "DEF", Type = "3", Count = 25 }, new MyObject { Code = "DEF", Type = "1", Count = 20 }, new MyObject { Code = "DEF", Type = "2", Count = 10 }, new MyObject { Code = "XYZ", Type = "3", Count = 11 }, new MyObject { Code = "XYZ", Type = "1", Count = 12 }, new MyObject { Code = "XYZ", Type = "3", Count = 15 } };
实现合并逻辑(匹配对应条目相加)
这种方式会保留相同Code+Type的多条目,按原始列表中的顺序一一配对相加:
// 按Code和Type分组,存入字典便于快速查找 var groupedA = resultSetA.GroupBy(obj => new { obj.Code, obj.Type }) .ToDictionary(g => g.Key, g => g.ToList()); var groupedB = resultSetB.GroupBy(obj => new { obj.Code, obj.Type }) .ToDictionary(g => g.Key, g => g.ToList()); // 获取所有唯一的Code+Type组合键 var allKeys = groupedA.Keys.Union(groupedB.Keys); var mergedList = new List<MyObject>(); foreach (var key in allKeys) { // 取出当前键对应的两个列表,没有则返回空列表 var listA = groupedA.TryGetValue(key, out var aItems) ? aItems : new List<MyObject>(); var listB = groupedB.TryGetValue(key, out var bItems) ? bItems : new List<MyObject>(); // 将两个列表的对应元素配对,Count相加生成新对象 var pairedItems = listA.Zip(listB, (a, b) => new MyObject { Code = key.Code, Type = key.Type, Count = a.Count + b.Count }); mergedList.AddRange(pairedItems); } // 按Code和Type排序,和示例结果顺序对齐 mergedList = mergedList.OrderBy(obj => obj.Code).ThenBy(obj => obj.Type).ToList();
补充:如果需求是相同Code+Type的所有Count求和(合并为单条)
如果不需要保留多条相同Code+Type的记录,而是将该组合下的所有Count总和显示为单条,可以用以下方式:
var summedResult = resultSetA.Concat(resultSetB) .GroupBy(obj => new { obj.Code, obj.Type }) .Select(g => new MyObject { Code = g.Key.Code, Type = g.Key.Type, Count = g.Sum(item => item.Count) }) .OrderBy(obj => obj.Code).ThenBy(obj => obj.Type) .ToList();
内容的提问来源于stack exchange,提问作者Ibanez1408
相关产品推荐
相关产品推荐

