C#异常:“集合已被修改,可能无法操作枚举类型”

C#笔记 ningjian

异常原因
一般产生于未安全处理集合一类的循环导致,常见于foreach循环的时候,表达式被改变导致。

简单的讲就是:被遍历的集合在遍历过程中,被其他线程或者地方改变

 

public void ForeachDic()     
{     
     Dictionary<String, Int32> dic = new Dictionary<String, Int32>();   
     dic.Add("1", 10);     
     dic.Add("2", 20);     
     dic.Add("3", 30);     
     foreach (KeyValuePair<String, Int32> kvp in dic)     
     {     
         Console.WriteLine(String.Format("Key:{0}; Value:{1}", kvp.Key, kvp.Value));     
         dic[kvp.Key] = 100;//此操作会报错:集合已修改;可能无法执行枚举操作。    
     }     
}
  


 

解决办法
1、通常情况下,不要在枚举集合的操作,比如Foreach中去执行修改集合的操作,如果需要修改,应先使用ToArray()方法

 

public void ForeachDic()     
{     
     Dictionary<String, Int32> dic = new Dictionary<String, Int32>();   
     dic.Add("1", 10);     
     dic.Add("2", 20);     
     dic.Add("3", 30);     
     foreach (KeyValuePair<String, Int32> kvp in dic.ToArray())     
     {     
         Console.WriteLine(String.Format("Key:{0}; Value:{1}", kvp.Key, kvp.Value));     
         dic[kvp.Key] = 100;
     }     
}

2、把foreach改为 for(int i =0) 后,问题解决

private void ForeachDic()     
{     
     Dictionary<String, Int32> dic = new Dictionary<String, Int32>();   
     dic.Add("1", 10);     
     dic.Add("2", 20);     
     dic.Add("3", 30);    
     String[] keyArr = dic.Keys.ToArray<String>();     
     for (int i = 0; i < keyArr.Length; i++)     
     {     
         dic[keyStr[i]] = dic[keyStr[i]] + 1;     
      }     
} 

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

发表评论:

验证码