集合已修改;可能无法执行枚举操作。

foreach是取只读的,在取的时候数据不能变(包括修改,删除,添加等)。要避免这个问题,就应该使用for循环。

       之前没有考虑过对collection类型对象操作时for 和foreach的区别,总感觉foreach更方便一些。今天写了个FOREARCH循环来操作删除某个 collection的元素,出现异常:查询集合已修改;可能无法执行枚举操作查了一下,这个是使用foreach的典型的问题。foreach是取只读的,在取的时候数据不能变(包括修改,删除,添加等)。要避免这个问题,就应该使用for循环……

在foreach遍历Dictionary或者hash时,如果删除元素就会报这个错。试过遍历Keys,但删除元素后还是报一样的错。

解决办法:用一个List把要删除的Keys记录了,遍历完后,把Keys中的元素全删了

 

这种情况是由于System.Collection.Generic泛型中集合List<>中执行了Remove()方法,则原有集合将被修改,而foreach的实现依赖于IEnumerable接口或实现GetEnumerator方法,这样均需要使用List<>实例的length属性。由于原有集合的长度为不确定因素,此时则将出现无法实现进行枚举操作的逻辑错误。

解决方法是使用for循环进行遍历删除,并将游标变量在删除元素的同时自减1.

 

            for (int i = 0; i < xylist.Count; i++)
            {
                double DIST = CoordDispose.getDistance(longitude, latitude, xylist[i].PositionX, xylist[i].PositionY);
                //如果得到的距离大于设定的距离,则去掉
                if (DIST > 500)
                {
                    xylist.Remove(xylist[i]);
                    i--;    //游标也需要跟着-1
                }
            }
时间: 2024-10-27 17:56:47

集合已修改;可能无法执行枚举操作。的相关文章

C# 集合已修改;可能无法执行枚举操作

/********************************************************************** * C# 集合已修改;可能无法执行枚举操作 * 说明: * 之前搞Java的时候就很清楚使用多线程操作集合的时候,很容易出现线程 * 安全的问题,还有就是操作线程的时候容易出现集合被修改的问题. * * 2016-12-12 深圳 南山平山村 曾剑锋 ****************************************************

c#“集合已修改;可能无法执行枚举操作”

list中用了remove操作,结果报这个错误. 使用foreach不能执行删除.修改,这是规定.你可以使用for循环遍历修改. 如果你是删除的话,for循环 i 要从大到小,比如: for(int i=50;i>=0;i--){ } 而不是 for(int i=0;i<=50;i++){ } 因为当用foreach遍历Collection时,如果对Collection有Add或者Remove操作或者给item某个属性赋值都会有这个错误. 因为Collection返回的IEnumerator把

{&quot;集合已修改;可能无法执行枚举操作。&quot;}

无论是向集合中添加元素还是从集合中删除元素,都会导致集合内部的变化,特别是集合遍历器的变化.例如 List<int> list = new List<int>{1,2,3,4,5}; foreach(int x in list) { list.Remove(x); //将引发异常:{"集合已修改:可能无法执行枚举操作."} } 使用foreach不能执行删除.修改,这是规定.你可以使用for循环遍历修改. 如果你是删除的话,for循环 i 要从大到小,比如: f

解决点击关闭按钮,应用程序退出时,系统爆出“集合已修改,可能无法执行枚举操作”异常的相关思路

这两天在优化升级公司的一个业务系统时,更改了一下窗体关闭事件中的一句代码,由system.Enviromen.Exit(0)改为了Application.Exit();但是这时候问题就出现了,当点击系统右上角关闭按钮的时候,会爆出“集合已修改,可能无法执行枚举操作”的异常.如下图所示: 这是什么原因造成的呢?问了一下度娘,出现“集合已修改,可能无法执行枚举操作”这种异常大部分都是因为误用foreach语句引起的,foreach是取只读的,在取的时候数据不能变(包括修改,删除,添加等).要避免这个

C#使用List出现“集合已修改;可能无法执行枚举操作”错误的解决办法

原因: 在循环的时候,当集合被删除了一个item后,那么总数 count和索引就会发生改变.所以会报错 解决方法: 不要在List上执行枚举集合的操作(例如foreach)中去执行修改集合的操作.如果需要修改集合,先使用 ToArray() 方法转化成Array,例如 foreach(string s in rs.ToArray()) { if(s.IndexOf(t)<0) { rs.Remove(t); } } 原文地址:http://blog.51cto.com/13567390/2061

[C#]集合已修改;可能无法执行枚举操作

摘要 我相信很多人对这个再熟悉不过了.对已经修改的集合进行操作就会出现这个错. 解决办法 比如有下面的一段代码,我们创建一个集合,并向集合中添加10个数,然后,我们循环再将这些数移除了. static void Main(string[] args) { List<int> lst = new List<int>(); for (int i = 0; i < 10; i++) { lst.Add(i); } foreach (var item in lst) { lst.Re

集合已修改,可能无法执行枚举操作

常规是foreach循环过程中对象发生变化,此处的变化不包括对象内属性的修改,仅限于对象. 案例: List<Person> Persons; foreach(Person p in Persons) { p = new Person(); //错误,对象发生了变化. p = existPerson;  //错误,对象发生了变化. p.Name = "Lanny"; //正确,属性是允许修改的. }

GMAP 集合已修改;可能无法执行枚举操作 错误【正解】(原创)

这个例子引自http://q.cnblogs.com/q/60028/,我做的时候遇到同样的问题,问了没有人回答我,后来我找到了解决办法,在此分享. 先看一下问题: 今天在主界面里写了一个Thread,函数用While(1)循环,循环中先查找数据库中的最新记录,然后把最新记录的坐标值添加到GMap控件中的一个overlay中显示出来,王红说那个有人说把foreach改成for就好了,可是我还是出这个异常,而且位置奇怪,是程序的Program.cs文件中出现的,代码如下: static class

【转】集合已修改;可能无法执行枚举操作

转自:http://bbs.csdn.net/topics/370152213 #2楼 foreach 值是只读的. 所以只能用 for Dictionary<int, int> d = new Dictionary<int, int>();    d.Add(1, 1);    var target = d.ToList();    for (int index = 0; index < target.Count; index++)      XX.Write(target