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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 10:45:05