【c#】System.InvalidOperationException:“Collection was modified; enumeration operation may not execute

一:问题描述

在 foreach 里对一个 List 列表执行 Add 或者 Remove 操作时,如下代码所示

class Program
{
    static List<string> nameList = new List<string>();

    static void Main(string[] args)
    {
        nameList.Add("苏醒");
        nameList.Add("AllenSu");

        foreach (var name in nameList)
        {
        	nameList.Add("庆余年");	// 添加
            nameList.RemoveAt(0);	// 移除
        }
        Console.ReadKey();
    }
}

会报如下错误。
在这里插入图片描述

二:解决方案

将 foreach 改为 for 循环即可,如下代码所示

for (int i = 0; i < nameList.Count; i++)
{
	nameList.Add("庆余年");
    nameList.RemoveAt(0);
}

三:发生原因

网上搜了一些相关资料,有的讲的太深,有的讲的太多都不想看下去,这里我简单整理了几个重要的地方,仅供参考。

参考一:
因为 foreach 内部使用的是 Iterator(迭代器),内部代码先判断是否 hasNext,然后再去调用 next,这两个函数是引起问题的关键。

参考二:
使用 foreach 遍历列表或者字典时,如果执行 Add 或者 Remove 操作或者给 item 某个属性赋值都会有这个错误。

因为返回的 IEnumerator 把当前的属性暴露为只读属性,所以对其的修改会导致运行时错误。

特例:
如果你在 foreach 中批量执行添加或者移除操作时,会引起该错误,不过如果你只对第一个元素执行操作,操作之后并执行 break ,是不会引起这个错误的。

比如这里我在 foreach 中执行添加操作后,直接 break 掉,并打印此时列表的个数,如下代码所示

static void Main(string[] args)
{
	nameList.Add("苏醒");
    nameList.Add("AllenSu");

    foreach (var name in nameList)
    {
     	nameList.Add("庆余年");
        break;
    }
    
    Console.Write(nameList.Count);   
    Console.ReadKey();
}

控制台运行结果如下
在这里插入图片描述
不过,实际中谁也不会在循环里执行一次操作,这里也就是测试才会这样去写。


结束语

如果这篇博客有幸帮到了您,欢迎点击下方链接,和更多志同道合的伙伴一起交流,一起进步。

开发者俱乐部
在这里插入图片描述

发布了187 篇原创文章 · 获赞 253 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/qq_42351033/article/details/103745998