c# - 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 分钟。
有什么帮助吗?
提前致谢
解决方案
很难说,因为我们不知道什么类型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);
}
}
推荐阅读
- python - 'plt.contourf' 在对数刻度中具有给定数量的级别
- python - Python 每 X 秒运行一次程序?
- python-3.x - 将数据从一个 pandas 数据帧附加到另一个数据帧
- android - 如何解决 Android Studio Emulator 上的此错误“AVD Pixel_XL_API_30 的模拟器进程已被杀死”
- php - 在 WooCommerce 中移动单个产品星级评分
- spotfire - Spotfire - 根据计算列条件创建 KPI
- maven - 从自定义模块中排除包
- android - React-Native 应用程序在构建时抛出 SHA-1 错误
- javascript - 滚动期间未调用 React eventListener(React)
- reactjs - 在 reactjs 中显示数组数据