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

7
 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();

当执行此代码时,会出现“集合已修改,枚举操作可能无法执行”的错误。为什么会出现这种情况呢?

你是否看到了SO上根据这个异常出现的重复问题? - Tim Schmelter
可能是重复的问题:集合已被修改;枚举操作可能无法执行 - Magnus
4个回答

10

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);
}

这应该解决你的问题。


1
@kls 如果这解决了你的问题,请考虑接受它作为正确答案。 - David Watts

6

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

@kls:那么请尝试我的第二种方法,我会删除第一种。 - Tim Schmelter

2

您不能在foreach循环内部删除,可以使用for循环或创建一个删除列表:

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();
 }

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();

你可以使用这个,一个循环。 对于任何看到这篇文章的人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接