错误记录--关于foreach,集合已修改;可能无法执行枚举操作

时间:2023-03-09 00:19:15
错误记录--关于foreach,集合已修改;可能无法执行枚举操作

集合已修改,可能无法执行枚举操作。今天在使用foreach遍历的时候出现了这样的错误。查了一下,这个是使用foreach的典型的错误问题问题。foreach在遍历取数据的过程中,枚举器只允许读,不允许更改其中的数据,包括修改删除添加。这种情况下如果需要改动数据,应该使用for遍历。

错误代码

         /// <summary>
/// 获得表中不含列名id的所有列名
/// </summary>
/// <param name="dtCols"></param>
/// <returns></returns>
private static string[] GetColsWithoutId(DataTable dtCols)
{
List<string> list = new List<string>();
list.AddRange(GetCols(dtCols));
foreach (string colname in list)
{
if (colname.Equals("id", StringComparison.CurrentCultureIgnoreCase))
{
list.Remove(colname);//foreach是只读的,在取的时候数据不能变(包括修改,删除,添加等)--避免出现错误:集合已修改;可能无法执行枚举操作
}
}
return list.ToArray();
}

foreach经典错误

修改代码

         /// <summary>
/// 获得表中不含列名id的所有列名
/// </summary>
/// <param name="dtCols"></param>
/// <returns></returns>
private static string[] GetColsWithoutId(DataTable dtCols)
{
List<string> list = new List<string>();
list.AddRange(GetCols(dtCols));
//foreach(string colname in list)
//{
// if(colname.Equals("id",StringComparison.CurrentCultureIgnoreCase))
// {
// list.Remove(colname);//foreach只读,在取的时候数据不能变(包括修改,删除,添加等)--避免出现错误:集合已修改
// }
//}
for (int i = list.Count - ; i >= ; i--)//foreach只读,在取的时候数据不能变(包括修改,删除,添加等)--避免出现错误:集合已修改;可能无法执行枚举操作,采用for,从最后一个开始遍历,避免遗漏
{
if (list[i].Equals("id", StringComparison.CurrentCultureIgnoreCase))
{
list.RemoveAt(i);
}
}
return list.ToArray();
}

for-修改代码