C# 意外';收集被修改;枚举操作可能无法执行;列表枚举异常,尽管列表未被修改
我收到代码中的异常“System.InvalidOperationException:'集合已修改;枚举操作可能无法执行'”。我理解异常是什么,但我不理解的是为什么我要从我的代码中得到它C# 意外';收集被修改;枚举操作可能无法执行;列表枚举异常,尽管列表未被修改,c#,exception,foreach,nested,enumeration,C#,Exception,Foreach,Nested,Enumeration,我收到代码中的异常“System.InvalidOperationException:'集合已修改;枚举操作可能无法执行'”。我理解异常是什么,但我不理解的是为什么我要从我的代码中得到它 public static void DiffCircles(Circle original, Circle toSubtract) { List<Vector2> originalAreaCopy = original.area; f
public static void DiffCircles(Circle original, Circle toSubtract)
{
List<Vector2> originalAreaCopy = original.area;
foreach(Vector2 oArea in original.area) -- **Exception occurs here on the second iteration**
{
foreach(Vector2 tsArea in toSubtract.area)
{
if(oArea.X == tsArea.X && oArea.Y == tsArea.Y)
{
originalAreaCopy.Remove(originalAreaCopy[original.area.IndexOf(oArea)]);
}
}
}
original.area = originalAreaCopy;
}
公共静态无效圆(圆原图、圆到子图)
{
List originalAreaCopy=original.area;
foreach(Vector2-oArea在original.area中)--**在第二次迭代中出现异常**
{
foreach(toSubtract.区域内的Vector2 tsArea)
{
if(oArea.X==tsArea.X&&oArea.Y==tsArea.Y)
{
移除(原始区域索引[原始区域索引(oArea)]);
}
}
}
原始面积=原始面积;
}
最初,我通过在if语句中执行original.area.Remove(oArea)来删除重叠的向量2。我得到了这个异常,然后查找它,并意识到为什么我会得到它。所以我想,如果我制作一个复制列表,从复制列表中删除重叠,然后在嵌套循环结束后将原始列表设置为与复制列表相等,我就可以了。然而,令人惊讶的是,我仍然得到了例外
有人能解释一下为什么我仍然会犯这个错误吗?我不再在循环过程中修改集合,所以我认为这会起作用,但由于某些原因它不会
谢谢 你的困惑源于这个假设: 所以我想如果我做一份复印清单
这将构造一个包含
original.area
中所有元素的新列表,因此现在original.area
和originalAreaCopy
实际上引用了两个不同的列表对象。originalAreaCopy
不是副本。它是一个变量,引用的列表与original.area
完全相同。所以在枚举过程中您仍然在修改colleciton,这实际上非常有意义!谢谢这确实修复了异常(不幸的是不是代码D:),因为“original.area”对象是一个列表,而我使用了originalAreaCopy.AddRange,这也有效抱歉,另一个更新-我还发现,我可以使用for循环,而不是使用foreach循环,从而简化整个过程,因为我可以从每个循环的原始列表中删除for循环的索引。这就是我凌晨2点做我的项目所得到的。。。
List<Vector2> originalAreaCopy = original.area;
List<Vector2> originalAreaCopy = original.area.ToList();