C# 如何移除列表重复对象并累加相同name和comment条目的quantity值
实现方案
核心逻辑是基于name和comment两个字段作为唯一判重键,对同组的quantity做累加,C#有两种常用的落地实现方式:
前置准备:类定义
先把Example类调整为符合C#常用规范的结构(如果需要保留原始字段语法,修改代码中对应属性引用为字段即可):
public class Example { public int Quantity { get; set; } public string Name { get; set; } public string Comment { get; set; } }
方案1:LINQ GroupBy 最简实现
这是最简洁的写法,利用C#匿名类型默认按值比较的特性做自动分组:
// inputList 为你的原始输入列表 List<Example> result = inputList // 以Name和Comment作为分组键,值完全一致的条目会被分到同一组 .GroupBy(x => new { x.Name, x.Comment }) .Select(g => new Example { Name = g.Key.Name, Comment = g.Key.Comment, // 累加同组所有条目的Quantity值 Quantity = g.Sum(item => item.Quantity) }) .ToList();
如果需要复用分组中第一个匹配的原对象,不生成新对象,可以修改Select逻辑:
List<Example> result = inputList .GroupBy(x => new { x.Name, x.Comment }) .Select(g => { var firstItem = g.First(); firstItem.Quantity = g.Sum(item => item.Quantity); return firstItem; }) .ToList();
方案2:字典实现(无LINQ依赖,性能更优)
如果不想引入LINQ,或者需要更精细的过程控制,可以用字典做缓存判重:
// 用值元组作为字典键,天然支持按值比较 var uniqueMap = new Dictionary<(string Name, string Comment), Example>(); foreach (var item in inputList) { var key = (item.Name, item.Comment); if (uniqueMap.TryGetValue(key, out var existItem)) { // 已存在则累加数量 existItem.Quantity += item.Quantity; } else { // 不存在则加入字典 uniqueMap.Add(key, item); } } // 最终结果取字典的值即可 List<Example> result = uniqueMap.Values.ToList();
注:值元组是C# 7.0及以上版本支持的语法,如果使用更低版本,可以自定义相等比较器,或者将两个字段拼接为带特殊分隔符的字符串作为键(注意规避字段本身包含分隔符的冲突问题)。
两种方案跑你的示例输入,都能得到你给出的期望输出。
内容的提问来源于stack exchange,提问作者Esteban Chornet
相关产品推荐
相关产品推荐

