在 foreach 中操作集合时报错:Collection was modified; enumeration operation may not execute.

摘要:
下面将描述场景并提供解决方案:vardict=newDictionary˂string,Dictionary˃();foreach{//具体业务代码}如果出现如标题中的错误,则需要将foreach修改为for。正好Dictionary与List的修改方式略有不同,所以就用Dictionary。vardict=newDictionary˂string,Dictionary˃();varkeys=newList;//将Key值全部取出并放入List中便于遍历for{varkey=keys[i];//具体业务代码}这样就可以顺利操作集合了。之前有提到过对于应用类型的操作《.NETCore深度克隆对象,引用类型的平行世界》文章,可以通过Clone的方式重新申请内存地址来避免循环操作集合导致的逻辑错误。

错误信息:System.InvalidOperationException: Collection was modified; enumeration operation may not execute.

在 foreach 操作集合时就有可能遇到这个错误提示。下面将描述场景并提供解决方案:

var dict = new Dictionary<string, Dictionary<string, int[]>>();
foreach (var item in dict)
{
    //具体业务代码
}

如果出现如标题中的错误,则需要将 foreach 修改为 for。正好 Dictionary 与 List 的修改方式略有不同,所以就用 Dictionary 。下面是修改为 foreach 为 for 后的逻辑。

var dict = new Dictionary<string, Dictionary<string, int[]>>();
var keys = new List<string>(dict.Keys);//将 Key 值全部取出并放入 List 中便于遍历
for (int i = 0; i < keys.Count; i++)
{
    var key = keys[i];
    //具体业务代码
}

这样就可以顺利操作集合了。原因是引用类型内存地址指向同一内存地址导致的。

之前有提到过对于应用类型的操作《.NET Core 深度克隆对象,引用类型的平行世界》文章,可以通过 Clone 的方式重新申请内存地址来避免循环操作集合导致的逻辑错误。

免责声明:文章转载自《在 foreach 中操作集合时报错:Collection was modified; enumeration operation may not execute.》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇YOLO v4分析C++库文件解析(conio.h)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

谈jdbcTemplate与mybatis

为什么会产生 Hibernate Mybatis 这类的dao层框架 传统的jdbc 虽然执行速度很快,但是开发效率很低,随着面向对象开发的设计思想,在面向对象编程中 将对象 进行持久化,存入关系型的数据库时,由于关系型数据库的设计思想是数学思维,在持久化时,必须要对象拆分各个属性值,才可存入数据库;传统的jdbc 持久化时 对象持久化时 ,取出对象的一个...

Java中针对Yaml格式数据操作记录

写在前面 最近由于涉及的功能需要对Nacos配置信息通过代码实现发布,在此过程中,涉及到String字符串转换Map,Map转换为Yaml格式的字符串等方法,由于之前没有接触过此方面内容,所以特在此进行记录,以做备忘! 1、Nacos获取配置 Nacos获取配置信息,返回结果为String格式字符串,这里可以参看Nacos中文文档(地址为:https://...

使用JNotify 监控文件变化

原文:https://blog.csdn.net/meteorsshower2013/article/details/80937725 其他参考文章:https://www.iteye.com/blog/cybrc-1900042                          https://zhuanlan.zhihu.com/p/152229305...

在lua的string库和正则表达式

一.前提要了解一下lua 的string几个方法 1. string库中所有的字符索引从前往后是1,2,...;从后往前是-1,-2,... 2. string库中所有的function都不会直接操作字符串,而是返回一个结果 string.len(s):返回字符串的长度. string.lower(s):变小写. string.upper(s):变大写....

【ECMAScript5】ES5基础

一、语法 区分大小写。 变量是弱类型的,可以初始化为任意值,也可以随时改变变量所存数据的类型。 每行结尾的分号可有可无,但是建议加上。 注释 单行注释以双斜杠开头(//) 多行注释以单斜杠和星号开头(/*),以星号和单斜杠结尾(*/) 代码块:用{ } 包起来的 二、变量 使用 var (variable的缩写)运算符声明变量。 可以用一个var...

[原创]Spring JdbcTemplate 使用总结与经验分享

引言 近期开发的几个项目,均是基于Spring boot框架的web后端项目,使用JdbcTemplate执行数据库操作,实际开发过程中,掌握了一些有效的开发经验,踩过一些坑,在此做个记录及总结,与各位读者分享。 欢迎留言与我交流。 正确使用JdbcTemplate执行数据库操作 1、Bean声明 新增类型DatabaseConfiguration,添加注...