前段时间碰到一个问题,就是在用foreach 遍历集合的时候,删除其中元素的时候会报错。具体错误:
InvalidOperationException: Collection was modified; enumeration operation may not execute.
错误指示在foreach那一行。
后来才发现在foreach中删除元素时,每一次删除都会导致集合的大小和元素索引值发生变化,从而导致在foreach中删除元素会出现异常。
然后改用for循环来删除,这里做了一个测试。
List<int> TestList = new List<int>();
private void Start()
{
TestList.Add(1);
TestList.Add(2);
TestList.Add(3);
TestList.Add(3);
TestList.Add(5);
TestFun();
}
private void TestFun()
{
for (int i = 0; i < TestList.Count; i++)
{
Debug.Log("删除前的:" + TestList[i]);
}
for (int i = 0; i < TestList.Count; i++)
{
if (TestList[i]==3)
{
TestList.Remove(TestList[i]);
}
}
for (int i = 0; i < TestList.Count; i++)
{
Debug.Log("删除后的:" + TestList[i]);
}
}
这个时候的输出结果:
这个时候发现还有一个元素3 没有删除掉。这是因为
当i=2时,满足条件执行删除操作,会移除第一个3,接着第二个3会前移到第一个3的位置,即下标2对应的是第二个3。
接着遍历i=3,也就跳过第二个3。
修改一下代码:
private void TestFun() { for (int i = 0; i < TestList.Count; i++) { Debug.Log("删除前的:" + TestList[i]); } for (int i = 0; i < TestList.Count; i++) { if (TestList[i]==3) { TestList.Remove(TestList[i]); i--; } } for (int i = 0; i < TestList.Count; i++) { Debug.Log("删除后的:" + TestList[i]); } }
这个时候就可以了:
这是一种方法,还可以采用倒序删除的方法,代码如下:
private void TestFun()
{
for (int i = 0; i < TestList.Count; i++)
{
Debug.Log("删除前的:" + TestList[i]);
}
for (int i = TestList.Count-1; i >=0; i--)
{
if (TestList[i]==3)
{
TestList.Remove(TestList[i]);
}
}
for (int i = 0; i < TestList.Count; i++)
{
Debug.Log("删除后的:" + TestList[i]);
}
}
结果:
这个时候就不需要下标--了。