集合已修改,可能无法执行枚举操作。今天在使用foreach遍历的时候出现了这样的错误。查了一下,这个是使用foreach的典型的错误问题问题。foreach在遍历取数据的过程中,枚举器只允许读,不允许更改其中的数据,包括修改删除添加。这种情况下如果需要改动数据,应该使用for遍历。
错误代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /// <summary> 2 /// 获得表中不含列名id的所有列名 3 /// </summary> 4 /// <param name="dtCols"></param> 5 /// <returns></returns> 6 private static string[] GetColsWithoutId(DataTable dtCols) 7 { 8 List<string> list = new List<string>(); 9 list.AddRange(GetCols(dtCols)); 10 foreach (string colname in list) 11 { 12 if (colname.Equals("id", StringComparison.CurrentCultureIgnoreCase)) 13 { 14 list.Remove(colname);//foreach是只读的,在取的时候数据不能变(包括修改,删除,添加等)--避免出现错误:集合已修改;可能无法执行枚举操作 15 } 16 } 17 return list.ToArray(); 18 }
修改代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /// <summary> 2 /// 获得表中不含列名id的所有列名 3 /// </summary> 4 /// <param name="dtCols"></param> 5 /// <returns></returns> 6 private static string[] GetColsWithoutId(DataTable dtCols) 7 { 8 List<string> list = new List<string>(); 9 list.AddRange(GetCols(dtCols)); 10 //foreach(string colname in list) 11 //{ 12 // if(colname.Equals("id",StringComparison.CurrentCultureIgnoreCase)) 13 // { 14 // list.Remove(colname);//foreach只读,在取的时候数据不能变(包括修改,删除,添加等)--避免出现错误:集合已修改 15 // } 16 //} 17 for (int i = list.Count - 1; i >= 0; i--)//foreach只读,在取的时候数据不能变(包括修改,删除,添加等)--避免出现错误:集合已修改;可能无法执行枚举操作,采用for,从最后一个开始遍历,避免遗漏 18 { 19 if (list[i].Equals("id", StringComparison.CurrentCultureIgnoreCase)) 20 { 21 list.RemoveAt(i); 22 } 23 } 24 return list.ToArray(); 25 }