如何合并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
相关产品推荐
相关产品推荐

