获取“ArgumentOutOfRangeException”错误但不知道如何?

时间:2016-02-22 04:28:47

标签: c#

我的代码在循环浏览列表时抛出了超出范围的错误,但我不知道为什么。这是我的代码:

        for(int neighborCounter = neighborList.Count - 1; neighborCounter >= 0; neighborCounter--)
        {
            for(int toBeCheckedCounter = toBeChecked.Count - 1; toBeCheckedCounter >= 0; toBeCheckedCounter--)
            {
                Vector2 tile1 = neighborList[neighborCounter];
                Vector2 tile2 = toBeChecked[toBeCheckedCounter];

                if(tile1 == tile2)
                {
                    neighborList.Remove(neighborList[neighborCounter]);
                }
            }
        }

如果你们需要更多背景,请告诉我。该错误出现在声明tile1的行上。看起来我正在尝试访问neighborList不包含的元素。

2 个答案:

答案 0 :(得分:4)

您的neighborCounter是外循环。如果您从neighborList移除了足够的内容,因为neighborCounter移动时toBeCheckedCounter没有移动,可能会有neighborCounter = neighborList.Count点,这会触发您的ArgumentOutOfRangeException

我建议你避免在循环或foreach中删除。您可以列出要删除的所有项目,并在之后进行,即

if(tile1 == tile2)
{
  itemsToRemove.Add(neighborList[neighborCounter]); // itemsToRemove can be a HashSet
}

答案 1 :(得分:0)

Tyress对他的解释是正确的:https://stackoverflow.com/a/35546304/4927547

另一种避免获取ArgumentOutOfRangeException的方法是重写代码,如下所示:

foreach (Vector2 neighbor in neighborList)
{
    foreach (Vector2 toBeCheckedItem in toBeChecked)
    {
        if (neighbor == toBeCheckedItem)
        {
            neighborList.Remove(neighbor);
        }
    }
}

另一种方式

foreach (Vector2 toBeCheckedItem in toBeChecked)
{
    if (neighborList.Contains(toBeCheckedItem))
    {
        neighborList.Remove(toBeCheckedItem);
    }
}