集合被修改枚举操作可能无法执行

时间:2015-02-20 10:17:16

标签: c# asp.net

 string field = ViewState["Field"].ToString();

 DataTable dt = (DataTable)Session["Academic"];
 foreach (DataRow dr in dt.Rows)
 {
      if (dr["Degree"].ToString() == field)
      {
            dr.Delete();
            dt.AcceptChanges();
      }
 }
 Session["Academic"] = dt;
 gdvwAcademic1.DataSource = Session["Academic"] as DataTable;
 gdvwAcademic1.DataBind();

当执行此代码时引发错误,因为"集合被修改,枚举操作可能无法执行。"为什么这样......?

4 个答案:

答案 0 :(得分:4)

您无法修改foreach中的集合。试试这个作为apomene答案的替代方法(除了使用列表的删除方法而不是索引之外,几乎做同样的事情。

List<DataRow> toDelete = new List<DataRow>();

foreach(DataRow dr in dt.Rows){
    if(dr["Degree"].ToString() == field){
        toDelete.Add(dr);
    }
}

foreach (DataRow dr in toDelete){
    dt.Rows.Remove(dr);
}

这可以解决您的问题。

答案 1 :(得分:1)

您无法在foreach中修改集合。所以不要删除或添加内容。

您可以通过创建包含要修改的项目的新集合来防止此错误,例如使用LINQ(ToList()是必不可少的):

var toDelete = dt.AsEnumerable().Where(r => r["Degree"].ToString() == field).ToList();

现在你可以毫无问题地循环播放。

foreach(DataRow rowToDelete in toDelete)
    rowToDelete.Delete();
dt.AcceptChanges(); // you could do that also in the loop now

答案 2 :(得分:0)

你不能删除foreach use for循环内部或删除List:

List <int> toBeDel=new List<int>();

  foreach (DataRow dr in dt.Rows)
 {
      if (dr["Degree"].ToString() == field)
      {
            toBEDel.Add(indexOf(dr));
      }
 }

 foreach (int i in toBeDel)
 {
     dt.Rows[i].Delete();
 }

答案 3 :(得分:0)

for (int i = 0;i < dt.Rows.Count; i++)
 {
      DataRow dr = dt.Rows[i];
      if (dr["Degree"].ToString() == field)
      {
            dr.Delete();
            i-=1;
      }
 }
dt.AcceptChanges();

您可以使用此循环。 对于任何人都可以找到这篇文章。