C# 意外';收集被修改;枚举操作可能无法执行;列表枚举异常,尽管列表未被修改

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

我收到代码中的异常“System.InvalidOperationException:'集合已修改;枚举操作可能无法执行'”。我理解异常是什么,但我不理解的是为什么我要从我的代码中得到它

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();