异常原因
一般产生于未安全处理集合一类的循环导致,常见于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循环