集合被修改枚举操作可能不会执行

kls*_*kls 5 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();
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*tts 7

您不能修改foreach. 尝试将此作为 apomene 答案的替代方法(几乎可以做同样的事情,除了使用列表的 remove 方法而不是索引。

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);
}
Run Code Online (Sandbox Code Playgroud)

这应该可以解决您的问题。


Tim*_*ter 6

您无法修改foreach. 所以不要删除或添加其中的东西。

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

var toDelete = dt.AsEnumerable().Where(r => r["Degree"].ToString() == field).ToList();
Run Code Online (Sandbox Code Playgroud)

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

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