如何优化按相同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
相关产品推荐
相关产品推荐

