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

如何将List<B>中匹配id的属性值赋值给List<A>?

解决List属性匹配赋值到List的问题

嗨,这个需求在日常开发里挺常见的,我给你两种实用的实现方式,你可以根据场景选择:

方式一:直接嵌套循环(简单直观)

如果你的数据量不大(比如这里lista只有10个元素,listb400个,其实总运算量也不大),直接用双层循环就能搞定,代码非常容易理解:

foreach (var a in lista)
{
    // 找到listb中id匹配的B元素
    var matchingB = listb.FirstOrDefault(b => b.id == a.id);
    if (matchingB != null)
    {
        a.val2 = matchingB.val2;
        a.val3 = matchingB.val3;
    }
    // 如果需要处理id不匹配的情况,可以在这里加else逻辑
}

这种写法的优点是代码简洁易懂,缺点是每次遍历A元素都要遍历一遍List,时间复杂度是O(n*m),当数据量特别大的时候性能会下降。

方式二:用Dictionary做映射(高效推荐)

如果以后数据量可能变大,或者想优化性能,推荐先把List转换成以id为键的Dictionary,这样查找匹配元素的时间复杂度会降到O(1),整体时间复杂度变为O(n+m),效率提升明显:

// 先把listb转成Dictionary,键是id,值是对应的B对象
var bDict = listb.ToDictionary(b => b.id);

foreach (var a in lista)
{
    // 尝试从字典中获取匹配的B元素
    if (bDict.TryGetValue(a.id, out var matchingB))
    {
        a.val2 = matchingB.val2;
        a.val3 = matchingB.val3;
    }
    // 同样,id不存在时可以在这里添加处理逻辑
}

这种方法的优势是查找速度快,尤其是当List的元素数量很多的时候,效果会非常明显。需要注意的是,如果List中有重复的id,ToDictionary会抛出异常,这时候你可以用GroupBy先处理重复项,比如取第一个匹配的:

// 处理listb中存在重复id的情况,取每个id对应的第一个B元素
var bDict = listb.GroupBy(b => b.id)
                 .ToDictionary(g => g.Key, g => g.First());

这样就完美解决了重复id的问题。


内容的提问来源于stack exchange,提问作者Naty Bizz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:33:29