如何合并两个IEnumerable并按Id匹配更新集合对应字段值
实现方案
核心思路
- 先将list2转换为以Id为键、对应完整条目为值的映射结构(字典/哈希表/Map),避免每次匹配全量遍历list2,性能更高
- 遍历list1的所有条目,若当前条目Id存在于映射结构中,直接将映射中对应条目的同名字段值覆盖到list1的当前条目即可
C# 实现代码
首先定义实体类:
public class StudyItem { public int Id { get; set; } public string Name { get; set; } public string Subject { get; set; } }
处理逻辑:
// 将list2转为Id为键的字典 var list2Dict = list2.ToDictionary(item => item.Id); // 遍历list1匹配更新 foreach (var item in list1) { if (list2Dict.TryGetValue(item.Id, out var updateItem)) { item.Name = updateItem.Name; item.Subject = updateItem.Subject; // 若有更多字段需要同步,在此处新增赋值逻辑即可 } }
Python 实现代码
假设列表元素为字典格式:
# 将list2转为Id为键的字典 list2_map = {item["Id"]: item for item in list2} # 遍历list1更新 for item in list1: if item["Id"] in list2_map: update_data = list2_map[item["Id"]] item["Name"] = update_data["Name"] item["Subject"] = update_data["Subject"]
JavaScript 实现代码
// 将list2转为Id为键的Map结构 const list2Map = new Map(list2.map(item => [item.Id, item])) // 遍历list1更新 list1.forEach(item => { if (list2Map.has(item.Id)) { const updateData = list2Map.get(item.Id) // 单个字段赋值写法 item.Name = updateData.Name item.Subject = updateData.Subject // 多字段批量覆盖可以直接用:Object.assign(item, updateData) } })
内容的提问来源于stack exchange,提问作者Raghavendra HG
相关产品推荐
相关产品推荐

