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

如何优化按相同ID将一个列表属性复制到另一个列表的代码?

当然可以优化得更简洁高效!

你的代码目前用了双重循环来匹配两个列表的ID,虽然能实现功能,但当列表数据量较大时,时间复杂度会达到O(n*m),而且代码也可以更紧凑。这里有几种优化方案:

方案1:用字典+LINQ(最常用,性能最优)

先把List2转换成以ID为键的字典,这样查找匹配项的时间复杂度降到O(1),然后结合LINQ来处理整个列表:

// 先将List2转为字典,快速通过ID查找对应的Model2
var model2Dict = List2.ToDictionary(m2 => m2.ID);

// 遍历List1,匹配并更新属性,最后转为新列表
var newList = List1.Select(m1 => 
{
    if (model2Dict.TryGetValue(m1.ID, out var matchingModel))
    {
        m1.Attribute = matchingModel.Attribute;
    }
    return m1;
}).ToList();

return newList;

这个版本不仅代码更简洁,性能也比双重循环提升很多——时间复杂度降到了O(n+m)(n是List1的长度,m是List2的长度)。

方案2:如果不想修改原List1的对象

原代码是直接修改List1中的对象再添加到新列表,如果需要创建全新的Model1实例而不改动原数据,可以这样写:

var model2Dict = List2.ToDictionary(m2 => m2.ID);

var newList = List1.Select(m1 => new Model1
{
    ID = m1.ID,
    // 复制Model1的其他属性...
    Attribute = model2Dict.TryGetValue(m1.ID, out var m2) ? m2.Attribute : m1.Attribute
}).ToList();

return newList;

方案3:处理List2存在重复ID的情况

如果List2里可能有多个相同ID的项,ToDictionary会抛出异常,这时候可以用ToLookup来分组:

var model2Lookup = List2.ToLookup(m2 => m2.ID);

var newList = List1.Select(m1 => 
{
    // 取第一个匹配的Model2(你也可以根据需求取最后一个或其他逻辑)
    var matchingModel = model2Lookup[m1.ID].FirstOrDefault();
    if (matchingModel != null)
    {
        m1.Attribute = matchingModel.Attribute;
    }
    return m1;
}).ToList();

return newList;

这些方案都能让代码更简洁易读,同时兼顾性能,你可以根据自己的实际场景选择合适的版本~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 06:27:27