首页 > 解决方案 > 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();


现在,我很清楚这种嵌套循环的方式并不是做事的最佳方式。我不是要求这是为了获得关于使用嵌套循环编写有多糟糕的无益评论。我问这个是为了回答我问的问题。但是,如果您决定告诉我编写嵌套循环有多糟糕,也请告诉我应该如何去做。

标签: c#

解决方案


不要在 tempItem 上使用 Clear 方法,而是在每次迭代开始时重新初始化该对象。

清除它也会清除列表中的项目。

将对象添加到字典时,添加的是引用而不是值。当您清除对象时,您会清除值,并且引用该对象的所有内容都将具有相同的效果(无值)。不是清除,而是重新初始化对象


推荐阅读