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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 15:30:49