c# - foreach 中嵌套 foreach 之后的代码未按预期执行
问题描述
我有这个代码:
foreach (KeyValuePair<string, KeyValuePair<float, float>> sysCoordTop in allSysCoords)
{
List<string> tempNameList = new List<string>();
float xTop = sysCoordTop.Value.Key;
float yTop = sysCoordTop.Value.Value;
string nameTop = sysCoordTop.Key;
foreach (KeyValuePair<string, KeyValuePair<float, float>> sysCoordBottom in allSysCoords) {
float xBottom = sysCoordBottom.Value.Key;
float yBottom = sysCoordBottom.Value.Value;
float xDiff = System.Math.Abs(xTop - xBottom);
float yDiff = System.Math.Abs(yTop - yBottom);
string nameBottom = sysCoordBottom.Key;
if (xDiff < 5f && yDiff < 5f && nameBottom != nameTop) {
tempNameList.Add(nameBottom);
Debug.Log($"{nameBottom} added to temp list at {nameTop}");
}
}
sysDict.Add(nameTop, tempNameList);
Debug.Log("temp list written to dict");
tempNameList.Clear();
}
我的问题是下面的行没有按我的预期执行,而是在嵌套循环之前执行一次,即使我假设它们在第一个 foreach 循环的每次迭代中执行一次。
sysDict.Add(nameTop, tempNameList);
Debug.Log("temp list written to dict");
tempNameList.Clear();
现在,我很清楚这种嵌套循环的方式并不是做事的最佳方式。我不是要求这是为了获得关于使用嵌套循环编写有多糟糕的无益评论。我问这个是为了回答我问的问题。但是,如果您决定告诉我编写嵌套循环有多糟糕,也请告诉我应该如何去做。
解决方案
不要在 tempItem 上使用 Clear 方法,而是在每次迭代开始时重新初始化该对象。
清除它也会清除列表中的项目。
将对象添加到字典时,添加的是引用而不是值。当您清除对象时,您会清除值,并且引用该对象的所有内容都将具有相同的效果(无值)。不是清除,而是重新初始化对象
推荐阅读
- c# - 使用 Azure 函数将 Excel 文件转换为 CSV
- openstreetmap - 将 osm.bz2 导入现有的 openstreetmap db 时出错
- excel - 用于查看工作簿中每个工作表大小的 VBA 代码
- sql - 使用 sql (Hive) 中的条件为每个 ID 选择随机行
- sql-server - 在 SQL Server 中更改表 date_time
- powershell - LogicApps 中的 Powershell Invoke-RestMethod
- angular - 如何正确地延迟加载角度组件?
- android - 为运输模式 RouteOptions.TransportMode.BICYCLE 启动导航时出现 OPERATION_NOT_ALLOWED 错误
- java - 如何从对象列表中选择一个对象
- java - 我正面临“java.lang.IllegalArgumentException:无法将 int 字段 com.example.demo.model.Customer.customerId 设置为 java.util.LinkedHashMap”