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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 23:05:45