[C#]集合已修改;可能无法执行枚举操作
摘要
我相信很多人对这个再熟悉不过了。对已经修改的集合进行操作就会出现这个错。
解决办法
比如有下面的一段代码,我们创建一个集合,并向集合中添加10个数,然后,我们循环再将这些数移除了。
- static void Main(string[] args)
- {
- List<int> lst = new List<int>();
- for (int i = ; i < ; i++)
- {
- lst.Add(i);
- }
- foreach (var item in lst)
- {
- lst.Remove(item);
- }
- Console.Read();
- }
出现了.....
是不是被泛型集合提供的方法坑了?我记得很久之前我也被坑过。很疑惑吧,其实也很简单,因为你如果移除了一项,集合的元素个数是变化的。这个时候元素会重排,第二个元素的索引由1变为0,后面的依次往前移动。
- static void Main(string[] args)
- {
- List<int> lst = new List<int>();
- for (int i = ; i < ; i++)
- {
- lst.Add(i);
- }
- var result = lst;
- Console.WriteLine("lst的count" + lst.Count);
- lst.Remove();
- Console.WriteLine("lst的count" + lst.Count);
- for (int i = ; i < lst.Count; i++)
- {
- Console.WriteLine("索引:{0},值:{1}", i, lst[i]);
- }
- Console.Read();
- }
上面的代码为集合添加10个元素。然后输出当前集合的count,接着将索引为0的元素移除。这个时候集合中应该没有元素0了。然后输出集合的元素个数。输出此时的集合中索引和对应的值。如图所示
可以看到,本来索引为1的1,往前移动了,此时他的索引变为了0.所以在使用foreach移除的时候,集合是变化的,是不允许的。难道就没办法操作了吗?当然有,它不是移除一个集合就少一个吗》
此时,我们可以通过for循环,从集合的队尾移除,这个时候移除队尾的元素,虽然集合的count变了,但他们的索引没有变化。
- static void Main(string[] args)
- {
- List<int> lst = new List<int>();
- for (int i = ; i < ; i++)
- {
- lst.Add(i);
- }
- var result = lst;
- Console.WriteLine("lst的count" + lst.Count);
- lst.Remove();
- Console.WriteLine("lst的count" + lst.Count);
- for (int i = lst.Count - ; i >= ; i--)
- {
- Console.WriteLine("索引:{0},值:{1}", i, lst[i]);
- Console.WriteLine("移除了元素:{0}", lst[i]);
- lst.RemoveAt(i);
- }
- Console.Read();
- }
那么我们只移除满足条件的是否也可以通过for循环呢?当然可以,foreach你不是不让吗?又不是只有你一个可以循环。
- static void Main(string[] args)
- {
- List<int> lst = new List<int>();
- for (int i = ; i < ; i++)
- {
- lst.Add(i);
- }
- var result = lst;
- Console.WriteLine("lst的count" + lst.Count);
- lst.Remove();
- Console.WriteLine("lst的count" + lst.Count);
- for (int i = ; i < lst.Count; i++)
- {
- Console.WriteLine("索引:{0},值:{1}", i, lst[i]);
- if (lst[i] % == )
- {
- Console.WriteLine("移除了元素:{0}", lst[i]);
- lst.RemoveAt(i);
- }
- }
- Console.Read();
- }
总结
前不久刚有人遇到,这里还是记录一下吧。
[C#]集合已修改;可能无法执行枚举操作的更多相关文章
- C# 集合已修改;可能无法执行枚举操作
在winform 项目时遇到: 集合已修改;可能无法执行枚举操作的问题 错误原因:当用foreach遍历Collection时,如果对Collection有Add或者Remove或其他类似操作都会有这 ...
- Collection was modified; enumeration operation may not execute Dictionary 集合已修改;可能无法执行枚举操作
public void ForeachDic() { Dictionary dic = new Dictionary(); dic.Add("1", 10); dic.Add(&q ...
- C# 集合已修改 可能无法执行枚举操作 zz
今天编写程序时 修改了list集合 在foreach时报 “集合已修改:可能无法执行枚举操作.”错误. 首先想到的是没有锁定集合对象. 增加了 private readonly object sync ...
- 黄聪:C#使用能够foreach对hashtable、List遍历时“集合已修改;可能无法执行枚举操作。”错误
解决办法:使用for循环,而不是foreach循环 例如: ArrayList akeys=new ArrayList(_transmit_tb.Keys); ;p> -;p--) { _tra ...
- C# DIctionary:集合已修改,可能无法执行枚举操作
C#中直接对集合Dictionary进行遍历并修改其中的值,会报错,如下代码就会报错:集合已修改;可能无法执行枚举操作.代码如下 public void ForeachDic() { Dictiona ...
- {"集合已修改;可能无法执行枚举操作。"}
无论是向集合中添加元素还是从集合中删除元素,都会导致集合内部的变化,特别是集合遍历器的变化.例如 List<,,,,}; foreach(int x in list) { list.Remove ...
- 错误记录--关于foreach,集合已修改;可能无法执行枚举操作
集合已修改,可能无法执行枚举操作.今天在使用foreach遍历的时候出现了这样的错误.查了一下,这个是使用foreach的典型的错误问题问题.foreach在遍历取数据的过程中,枚举器只允许读,不允许 ...
- .NET中集合已修改;可能无法执行枚举操作 的解决办法
foreach是取只读的,在取的时候数据不能变(包括修改,删除,添加等).要避免这个问题,就应该使用for循环. https://msdn.microsoft.com/zh-cn/library/tt ...
- foreach---集合已修改;可能无法执行枚举操作。
小结 : foreach是取只读的,在取的时候数据不能变(包括修改,删除,添加等).要避免这个问题,就应该使用for循环--- 原因: 当用foreach遍历Collection时,如果对Collec ...
随机推荐
- matplotlib 和 pandas 两个包的安装
matplotlib是强大的python 绘图包.pandas 是强大的python分析工具包.numpy是强大的python统计包. 都超级好用,而且最近开始动手实践机器学习算法了.特此备注一下安装 ...
- Redis集合-Set
sadd 向一个Set中添加数据 127.0.0.1:6379> sadd set01 1 1 2 2 3 3 (integer) 3127.0.0.1:6379> SMEMBERS se ...
- [日常训练]常州集训day5
T1 Description 小$W$和小$M$一起玩拼图游戏啦~ 小$M$给小$M$一张$N$个点的图,有$M$条可选无向边,每条边有一个甜蜜值,小$W$要选$K$条边,使得任意两点间最多有一条路径 ...
- 【UOJ#33】【UR#2】树上GCD 有根树点分治 + 容斥原理 + 分块
#33. [UR #2]树上GCD 有一棵$n$个结点的有根树$T$.结点编号为$1…n$,其中根结点为$1$. 树上每条边的长度为$1$.我们用$d(x,y)$表示结点$x,y$在树上的距离,$LC ...
- FAILED java.lang.IllegalArgumentException: java.net.URISyntaxException: Relative path in absolute URI:hdfs:192.*
运行的参数配置 hdfs:192.168.58.180/cf/userItem.txt 应该写成 hdfs://192.*
- BZOJ1407 [Noi2002]Savage
Description Input 第1行为一个整数N(1<=N<=15),即野人的数目. 第2行到第N+1每行为三个整数Ci, Pi, Li表示每个野人所住的初始洞穴编号,每年走过的洞穴 ...
- git恢复误删文件及省去密码提交
自己遇到这种情况:自己将某文件在网页的控制面板上直接删除了,再pull下来.或者一个成员误删除了某个文件,然后push到远程库了,其他成员也都pull了,结果就是所有人的本地库当前版本中这个文件都不见 ...
- Android成长日记-数据存储之SharedPreferences
数据篇-SharedPreferences Android的四种存储方式 1. SharedPreferences 2. SQLite 3. Content Provider 4. File ---- ...
- androidstudio 常用快捷键
ctrl+p 查看需要输入的函数列表 ctrl+h 查看继承关系 ctrl +w 选择一个,一行,一段. alter+enter 内容助理 ctrl+q 查看方法注解 相当于 hover ...
- Centos下查看占用端口并关闭进程方法
1.查看端口占用情况:netstat –tlnp (加p可以看到是哪个进程占用了端口); 也可以用grep查找对应的被占用的端口,键入netstat –tlnp | grep 3306可以看到PI ...