如果你需要在修改集合后继续枚举,通常的做法是重新创建枚举器或遍历一个新的集合。例如,在上面的代码中,我们使用了for循环来修改原集合,并在修改完成后使用foreach循环来输出修改后的集合。这样做是安全的,因为foreach循环是在修改操作完成后执行的。 另外,如果你在多线程环境中工作,确保对共享集合的访问是线程安全的...
通过修改循环方式来解决此问题,即将for循环改为基于索引的迭代,如for i in range(0, n)。这样在循环过程中不会引用已被修改的数据包,从而避免错误的发生。 修改后的代码如下: defBarItemClick(e):key = e.BarItemKey.ToUpperInvariant()# 将菜单标识转换为大写ifkey =="WUPC_tbButton".ToUpperInvariant(): b...
foreach (DictionaryEntry item in _transmit_tb)//弹出“集合已修改;可能无法执行枚举操作。” { if ((t - (DateTime)Time[item.Key]).Seconds > TimeOut) { LogOut(item.Key); //此函数的作用是剔除失效的主机 } } } 解决方法:利用for进行遍历。 ArrayList akeys=new ArrayList(_transmit_tb.Keys); ...
异常:集合已修改;可能无法执行枚举操作 摘要 我相信很多人对这个再熟悉不过了。对已经修改的集合进行操作就会出现这个错。 解决办法 比如有下面的一段代码,我们创建一个集合,并向集合中添加10个数,然后,我们循环再将这些数移除了。 static void Main(string[] args) { List<int> lst = new List<int>(); for...
c#“集合已修改;可能无法执行枚举操作” list中用了remove操作,结果报这个错误。 使用foreach不能执行删除、修改,这是规定。你可以使用for循环遍历修改。 如果你是删除的话,for循环 i 要从大到小,比如: for(inti=50;i>=0;i--){ } 而不是 for(inti=0;i<=50;i++){...
解决方案 为了避免 “System.InvalidOperationException” 异常的抛出,我们可以采用以下几种解决方案: 方案一:使用 for 循环 使用for 循环可以避免在枚举过程中对集合进行修改的问题。如下所示: List<Control>controls=newList<Control>();controls.Add(newTextBox());controls.Add(newButton());for(inti=controls.Co...
今天编写程序时 修改了list集合 在foreach时报 “集合已修改;可能无法执行枚举操作。”错误。 首先想到的是没有锁定集合对象。 增加了 private readonly object syncRoot = new object(); 所以先尝试 lock(syncRoot){} lock关键字用法,多线程共用对象时,操作对象时锁定对象,这样如果有别的线程访问对象,则自动加入...
解决方法: 不要在List上执行枚举集合的操作(例如foreach)中去执行修改集合的操作。如果需要修改集合,先使用 ToArray() 方法转化成Array,例如 foreach(string s in rs.ToArray()) {if(s.IndexOf(t)<0) { rs.Remove(t); } }
通过查阅微软开发文档发现原因:foreach语句是对枚举数的包装,它只允许从集合中read,不允许write。因为执行非read操作会造成list变化,比如索引变化,而foreach是不允许枚举对象变化的。 list.Remove(item); //就是这行代码的错,这锅它必须背。 解决方案
今天编写程序时 修改了list集合 在foreach时报 “集合已修改;可能无法执行枚举操作。”错误。 首先想到的是没有锁定集合对象。 增加了 private readonly object syncRoot = new object(); 所以先尝试 lock(syncRoot){} lock关键字用法,多线程共用对象时,操作对象时锁定对象,这样如果有别的线程访问对象,则自动加入...