我的代码在循环浏览列表时抛出了超出范围的错误,但我不知道为什么。这是我的代码:
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不包含的元素。
答案 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);
}
}