首页 > 解决方案 > C# 优化嵌套的 foreach 循环

问题描述

我编写了一个与大型 excel 一起使用并将条目映射到对象的库。但是在某些时候,由于三个嵌套的 foreach 循环,它变得非常慢。我已经看到了一些带有字典的解决方案,但是那里的问题与我的有所不同。

var house = new PostHouse();
house.FK_STRID = long.Parse(fields[2]);
if (!fields[3].Equals("")){
     house.HouseNumber = long.Parse(fields[3]);
}
foreach (var canton in cantons)
{
    foreach(var city in canton.Cities)
    {
        if (city.Streets == null) 
            city.Streets = new List<PostStreet>();
        foreach(var street in city.Streets)
        {
            if(street.STRID == house.FK_STRID)
            {
                if (street.Houses == null) 
                    street.Houses = new List<PostHouse>();
                street.Houses.Add(house);
            }
        }
    }
}

遍历所有内容大约需要 10 分钟。

有什么帮助吗?

提前致谢

标签: c#linq

解决方案


很难说,因为我们不知道什么类型cantons及其子项是什么以及它们来自哪里,但这里的主要问题是您的数据结构不适合该任务。当您需要的是按其 STRID索引的街道列表时,您有一个位于 Cantons 内部的城市内部街道的分层列表。

如果您可以对街道的存储方式进行初始处理,则可以执行以下操作:

var streetIndex = new Dictionary<string, PostStreet>();
foreach (var canton in cantons)
  foreach (var city in canton.Cities)
    foreach (var street in city.Streets)
    { 
        streetIndex.Add(street.STRID, street);
    }

那么当您在 O(1) 时间内迭代房屋时,您可以立即通过其 STRID 查找街道。

foreach (var house in houses)
{
    if (streetIndex.ContainsKey(house.FK_STRID))
    {
       streetIndex[house.FK_STRID].Add(house);   
    }
}

推荐阅读