如何在C#中按empId条件合并两个List<dynamic>对象
按empId匹配合并两个List的解决方案
直接用Newtonsoft.Json的合并方法无法实现按指定键匹配的逻辑,你可以借助字典或LINQ的连接操作完成需求,以下是具体实现:
基础匹配(仅保留object1中存在的empId)
先将object2转换为以empId为键的字典,实现O(1)的快速查找,再遍历object1合并属性:
// 构建email映射字典 var empEmailMap = object2.ToDictionary(item => (int)item.empId, item => item.emailAddress); // 生成合并结果 var mergedResult = object1.Select(item => new { empId = item.empId, empName = item.empName, emailAddress = empEmailMap.TryGetValue((int)item.empId, out var email) ? email : null }).ToList();
如果需要保留dynamic类型,可使用ExpandoObject:
var mergedDynamicList = new List<dynamic>(); var empEmailMap = object2.ToDictionary(item => (int)item.empId, item => item.emailAddress); foreach (var emp in object1) { dynamic mergedEmp = new ExpandoObject(); mergedEmp.empId = emp.empId; mergedEmp.empName = emp.empName; if (empEmailMap.TryGetValue((int)emp.empId, out var email)) { mergedEmp.emailAddress = email; } mergedDynamicList.Add(mergedEmp); }
全量匹配(包含两个列表中所有empId)
如果需要处理两个列表中存在对方没有的empId的场景,可使用LINQ的GroupJoin实现全连接:
var fullMergedList = object1 .GroupJoin(object2, emp1 => emp1.empId, emp2 => emp2.empId, (emp1, emp2Group) => new { Emp1 = emp1, Emp2 = emp2Group.FirstOrDefault() }) .Concat(object2 .GroupJoin(object1, emp2 => emp2.empId, emp1 => emp1.empId, (emp2, emp1Group) => new { Emp1 = emp1Group.FirstOrDefault(), Emp2 = emp2 }) .Where(join => join.Emp1 == null)) .Select(join => new { empId = join.Emp1?.empId ?? join.Emp2.empId, empName = join.Emp1?.empName, emailAddress = join.Emp2?.emailAddress }).ToList();
这种方式会保留所有存在的empId,缺失的属性会设为null,你可以根据需求调整处理逻辑(比如过滤掉缺失项)。
内容的提问来源于stack exchange,提问作者Karthi M
相关产品推荐
相关产品推荐

