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

如何合并List<object>中同名对象并将ID整合为列表?

最优解决方案:用LINQ分组合并

这问题太常见了!用C#的LINQ GroupBy就能完美解决,这也是处理这类「按字段分组合并关联数据」需求的标准最优方案,代码简洁还高效。

先直接上核心实现(针对你的List<object>场景)

首先我们先定义一个用来存合并结果的强类型类(比匿名对象或object更安全易维护):

public class MergedItem
{
    public string Name { get; set; }
    public List<int> Ids { get; set; } = new List<int>();
}

然后用LINQ一步完成分组和合并:

List<object> myArray = new List<object>
{
    new { name = "abc", id = 1 },
    new { name = "xxx", id = 2 },
    new { name = "abc", id = 3 }
};

var mergedResult = myArray
    // 按name字段分组,因为原列表是object,用dynamic访问属性
    .GroupBy(item => ((dynamic)item).name)
    // 把每组转换成我们定义的合并对象
    .Select(group => new MergedItem
    {
        Name = group.Key,
        // 提取组内所有id并转成列表
        Ids = group.Select(item => ((dynamic)item).id).ToList()
    })
    .ToList();

更推荐的强类型写法(避免dynamic的潜在风险)

如果可以的话,一开始就用强类型存储原始数据,比List<object>更安全,还能避免运行时类型错误:

// 先定义原始数据类
public class OriginalItem
{
    public string name { get; set; }
    public int id { get; set; }
}

// 初始化强类型列表
List<OriginalItem> myArray = new List<OriginalItem>
{
    new OriginalItem { name = "abc", id = 1 },
    new OriginalItem { name = "xxx", id = 2 },
    new OriginalItem { name = "abc", id = 3 }
};

// 合并代码更简洁安全,不需要dynamic
var mergedResult = myArray
    .GroupBy(item => item.name)
    .Select(group => new MergedItem
    {
        Name = group.Key,
        Ids = group.Select(item => item.id).ToList()
    })
    .ToList();

为什么这是最优方案?

  • 性能高效:GroupBy内部只遍历一次原始列表,时间复杂度是O(n),和手动用字典循环的效率一样,但代码更简洁。
  • 可读性强:声明式写法(告诉程序要做什么,而不是怎么做),一眼就能看懂是按name分组合并id。
  • 维护成本低:LINQ是C#的标准库功能,后续维护的开发者一看就懂,不用自己写复杂的循环逻辑。

手动实现的对比(不推荐,但可以参考)

如果你不想用LINQ,手动用字典也能实现,但代码量更大,容易出错:

Dictionary<string, List<int>> idMapping = new Dictionary<string, List<int>>();
foreach (var item in myArray)
{
    dynamic obj = item;
    string name = obj.name;
    int id = obj.id;

    if (!idMapping.ContainsKey(name))
    {
        idMapping[name] = new List<int>();
    }
    idMapping[name].Add(id);
}

var mergedResult = idMapping.Select(kv => new MergedItem
{
    Name = kv.Key,
    Ids = kv.Value
}).ToList();

显然,LINQ的写法更优雅高效,是首选方案。

内容的提问来源于stack exchange,提问作者Leo Messi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:46:26