C#中删除List里面的元素

前段时间碰到一个问题,就是在用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]);
        }
    }

结果:

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值