C#中删除List里面的元素

前段时间碰到一个问题,就是在用foreach 遍历集合的时候,删除其中元素的时候会报错。具体错误:

InvalidOperationException: Collection was modified; enumeration operation may not execute.

错误指示在foreach那一行。

后来才发现在foreach中删除元素时,每一次删除都会导致集合的大小和元素索引值发生变化,从而导致在foreach中删除元素会出现异常。

然后改用for循环来删除,这里做了一个测试。

 List TestList = new List();


    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]);
        }
    }

这个时候的输出结果:

C#中删除List里面的元素_第1张图片

这个时候发现还有一个元素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]);
        }
    }

这个时候就可以了:

C#中删除List里面的元素_第2张图片

这是一种方法,还可以采用倒序删除的方法,代码如下:

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]);
        }
    }

结果:C#中删除List里面的元素_第3张图片

这个时候就不需要下标--了。

你可能感兴趣的:(c#)