如何优化不同长度的嵌套for循环?

Posted

技术标签:

【中文标题】如何优化不同长度的嵌套for循环?【英文标题】:How to optimize the nested for loop with different lengths? 【发布时间】:2021-11-10 13:27:45 【问题描述】:

我需要在 c# 中使用 LINQ 或 Zip 优化 2 个嵌套的 for 循环,因为这段代码需要一些时间来加载。

这两个列表加载了api调用

List<OrderIncidentsDto> orderDtos = new List<OrderIncidentsDto>();
List<OrderItemDto> orderItemDtos = new List<OrderItemDto>();

我正在尝试使用两个嵌套的 for 循环来迭代这些数据

for (int incidents = 0; incidents < orderDtos.Count; incidents++) 

        var oItems = new List<OrderItemDto>();
    for (int items = 0; items < orderItemDtos.Count; items++)
    
        if (orderItemDtos[items].IncidentNumber == orderDtos[incidents].OrderIncidentName)
        
            oItems.Add(orderItemDtos[items]);
            orderDtos[incidents].OrderItems = oItems;
        
    

请建议我减少代码行数或摆脱多个循环的最佳方法。

【问题讨论】:

运行需要多长时间?每个列表中有多少项(不要猜测)? 请分享minimal reproducible example。 看看Grouped Joins 【参考方案1】:

您当前代码的时间复杂度为 O(n^2),这可以通过首先通过 IncidentNumberorderItemDtos 进行索引,然后在 orderDtos 上循环选择他们的订单项来减少到 O(n)

var orderItemLookup = orderItemDtos.ToLookup(x => x.IncidentNumber);
orderDtos.ForEach(order => order.OrderItems = orderItemLookup[order.OrderIncidentName]);

【讨论】:

以上是关于如何优化不同长度的嵌套for循环?的主要内容,如果未能解决你的问题,请参考以下文章

在java中,如何跳出当前的嵌套循环

优化四重嵌套“for”循环

Java for循环嵌套for循环,你需要懂的代码性能优化技巧

优化 Swift 中的嵌套 for 循环

带计数器的多处理嵌套 for 循环

for循环嵌套的优化