如何优化C#中不同长度列表的嵌套for循环,可使用LINQ或Zip方法
C# 嵌套循环优化方案
前提说明
你提到的Zip方法是按两个序列的索引位置对位合并元素,不适用当前按关联键匹配一对多数据的场景,这里用LINQ的预分组方案实现最优性能。
原有嵌套循环时间复杂度为 O(n*m),数据量越大耗时越高。优化后整体时间复杂度降为 O(n+m),同时代码量大幅精简。
最优实现代码
步骤1:预构建关联键分组结构(仅遍历一次订单项列表)
用ToLookup方法将orderItemDtos按IncidentNumber预分组,后续查找匹配项的时间复杂度为O(1):
var itemLookup = orderItemDtos.ToLookup(item => item.IncidentNumber);
步骤2:批量给订单赋值关联订单项(仅遍历一次订单列表)
foreach (var order in orderDtos) { order.OrderItems = itemLookup[order.OrderIncidentName].ToList(); }
极致精简写法(可选)
如果不需要复用分组结构,也可以用GroupJoin实现单流处理,功能完全等价:
orderDtos = orderDtos.GroupJoin( orderDtos: orderDtos, orderItemDtos: orderItemDtos, outerKeySelector: o => o.OrderIncidentName, innerKeySelector: i => i.IncidentNumber, resultSelector: (o, items) => { o.OrderItems = items.ToList(); return o; }).ToList();
内容的提问来源于stack exchange,提问作者Rajaraman
相关产品推荐
相关产品推荐

