数据行出错,Collection被修改; 枚举操作可能无法执行

man*_*ani 8 c# foreach datarow

我有for-each循环,其中数据行被更新,因此异常,Collection被修改; 生成枚举操作可能不会执行.有什么办法解决吗?我见过To-List函数,但它没有使用数据行,这是我的代码:

foreach (DataRow row in dataTable.Rows) {
  temp = row[0].ToString();
  foreach (DataRow rows in dataTable.Rows) {
    if (temp == rows[0].ToString()) {
      tempdatatable.Rows.Add(row[0],row[1]);
      dataTable.Rows.Remove(rows);
      //Update happens here
    }
    tempdatatable.DefaultView.Sort = "gscitations DESC";
    dataGridView1.DataSource = tempdatatable;
  }
}
Run Code Online (Sandbox Code Playgroud)

kos*_*oss 7

使用Enumerator枚举它时无法修改集合,这发生在foreach语句的场景(MDSN链接)之后.

解决此问题的一种可能方法是在第一个枚举中收集要删除的行,然后在单独的循环中删除它们,如下所示:

var rowsToDelete = new List<DataRow>();

foreach (DataRow row in dataTable.Rows)
     {
         temp = row[0].ToString();
         foreach (DataRow rows in dataTable.Rows)
         {
             if (temp == rows[0].ToString())
             {
                 tempdatatable.Rows.Add(row[0],row[1]);
                 rowsToDelete.Add(rows);
             }
             tempdatatable.DefaultView.Sort = "gscitations DESC";
             dataGridView1.DataSource = tempdatatable;
         }
     }

rowsToDelete.ForEach( x => dataTable.Rows.Remove(x) );
Run Code Online (Sandbox Code Playgroud)

您也可以用foreach循环替换循环for,但是在删除元素时需要执行额外的工作来正确处理当前索引.


PaR*_*RaJ 4

尝试这个 :

for (int i = 0; i < dataTable.Rows.Count; i++)
{
    var tempRow = dataTable.Rows[i];
    var temp = dataTable.Rows[i][0];
    for (int j = 0; j < dataTable.Rows.Count; j++)
    {
        DataRow rows = dataTable.Rows[j];
        if (temp == rows[0].ToString())
        {
            tempdatatable.Rows.Add(tempRow[0], tempRow[1]);
            dataTable.Rows.Remove(rows);      //Update happen here
        }
        tempdatatable.DefaultView.Sort = "gscitations DESC";
        dataGridView1.DataSource = tempdatatable;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 解决此问题的一种更简单的方法是将 dataTable.Rows 更改为 dataTable.Select(""),并且您不必担心创建 for 循环。http://codingcramp.blogspot.com/2014/10/collection-was-modified-enumeration.html 有一个很好的例子。 (2认同)