[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 ...
随机推荐
- Pointcut is not well-formed: expecting 'name pattern' at character position
配置aop报错:原因是配置切点表达式的时候报错了, 星号后面没有加空格: <aop:config> <aop:pointcut id="transactionPointcu ...
- Mybatis 保错:Mapped Statements collection already contains value for jaxrs.dch.projects.y
原因是mapper.xml中定义了相同的两个方法
- shell 常用小命令总结
1. 重命名 1) 较简单的处理命令:mv 原文件名 新文件名 如:mv myFile newName ### 将MyFile重命名为newN ...
- 谈谈JavaScript MVC模式
第一个是:没有使用mvc模式的: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "h ...
- 使用dnsmasq来提升CentOS上网速度
1. 安装dnsmasq dnsmasq的官方网址是:http://www.thekelleys.org.uk/dnsmasq/doc.html.利用里面的下载链接下载dnsmasq-2.72.tar ...
- MVC 路由
1.ASP.NET MVC框架中提供的URL路由机制能够使URL不必映射到应用程序的特定物理文件. 2.当用户访问基于MVC模式创建的网站时,只需要在浏览器地址栏里输入类似于下面的URL: http: ...
- PHPstorm激活
最近想学习一下PHP 于是下载了很不错的phpstorm 但这老外的工具是要购买正版的 所以就搜了一下破解激活的教程 发现现在网上的在线破解在2016.2版本里面大多已被封杀 尝试了本地破解也发现大 ...
- Python3导入cookielib失败
Python 3 改成 http.cookiejar了,所以只要改成import http.cookiejar就自动导入cookiejar了,如果还是不行,就把所有的.pyc删掉试试.
- 9.25 DOM作业
一<style type="text/css">*{margin:0px auto; padding:0px; font-family:微软雅黑; font-size: ...
- 表x有 一列 ,程序每次生成id的时候都先从这里获取最大值再加1,初始值是A0001,然后到A9999的时候则是到B0001 共5位
drop table x gocreate table x(id varchar(10))--insert into x values('A001')gowith a as (select ISNUL ...