C#中删除List里面的元素

探讨在C#中使用List类型时,如何避免在遍历过程中删除元素引发的异常。通过对比foreach与for循环,介绍正确的元素删除方法,包括正序删除时的索引调整及倒序删除策略。

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

结果:

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

C#中,有多种方法可以删除列表中的指定元素,以下是几种常见的方式: ### 借助List集合删除指定元素 可以将数组转换为List集合,找到指定元素的索引并删除元素,最后再将集合转换回数组。示例代码如下: ```csharp using System; using System.Collections.Generic; class Program { static void Main() { // 创建一个包含元素的数组 int[] numbers = { 1, 2, 3, 4, 5 }; // 将数组转换为List集合 List<int> numberList = new List<int>(numbers); // 需要删除元素 int elementToRemove = 3; // 查找元素的索引 int index = numberList.IndexOf(elementToRemove); if (index != -1) { // 删除索引对应的元素 numberList.RemoveAt(index); // 将修改后的集合转换回数组 numbers = numberList.ToArray(); // 输出修改后的数组 Console.WriteLine("删除元素后的数组:"); foreach (int number in numbers) { Console.Write(number + " "); } } else { Console.WriteLine("数组中不存在需要删除元素"); } // 等待用户输入以退出程序 Console.ReadLine(); } } ``` 此方法先把数组转为List集合,利用`IndexOf`方法找到指定元素的索引,再使用`RemoveAt`方法删除元素,最后将集合转回数组输出结果 [^1]。 ### 倒序遍历删除指定元素 从列表末尾向前遍历,删除元素不会影响未处理的索引。示例代码如下: ```csharp using System; using System.Collections.Generic; class Program { static void Main() { List<int> list = new List<int> { 1, 2, 3, 4, 5 }; for (int i = list.Count - 1; i >= 0; i--) { if (list[i] == 3) { list.RemoveAt(i); } } foreach (int number in list) { Console.Write(number + " "); } } } ``` 该方法从列表末尾开始遍历,当元素满足条件时,使用`RemoveAt`方法删除元素,避免了正序遍历删除元素时索引混乱的问题 [^2] [^4]。 ### 另一种倒序删除示例 ```csharp using System.Collections.Generic; using UnityEngine; public class Example : MonoBehaviour { List<int> TestList = new List<int> { 1, 2, 3, 4, 5 }; 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]); } } } ``` 此代码同样采用倒序遍历的方式,当元素等于指定值时,使用`Remove`方法删除元素 [^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值