在数据行错误,集合被修改; 枚举操作可能不会执行[复制](Error in datarow,Co

2019-07-21 18:53发布

这个问题已经在这里有一个答案:

  • 我如何遍历一个列表框中的项目,然后删除这些项目吗? 8个回答

我已经for-each循环中的数据行被更新所以异常, 集合被修改; 可能不会执行产生枚举操作 。 什么办法来解决呢? 我已经看到到列表的功能,但它不与数据行的工作,这里是我的代码:

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

Answer 1:

试试这个 :

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


Answer 2:

同时采用枚举,这是发生了的幕后枚举它不能修改收集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) );

您也可以替换foreach与循环for ,但你需要做额外的工作妥善处理当前索引,而删除的元素。



Answer 3:

我会说,你应该让条目的一个单独的表,而不是调用datatable.Rows.Remove(行),添加行“行”这个其他表。 然后,每当行或行迭代,你运行一个if语句来检查,如果其被“删除”,即删除行的列表。 枚举结束后,你就可以永久地从表中删除这些行。

编辑:

下面的代码实现:

DataTable duplicates = dataTable;
duplicates.Rows.Clear(); /* Produces an empty duplicate of the 
dataTable table to put the duplicates in */
foreach (DataRow row in dataTable.Rows)
{
     if (!duplicates.Rows.Contains(row))
     {    
         temp = row[0].ToString();
         foreach (DataRow rows in dataTable.Rows)
         {
             if (temp == rows[0].ToString()&&!duplicates.Rows.Contains(rows)) //need unique key
             {
                 tempdatatable.Rows.Add(row[0],row[1]);

             }
             tempdatatable.DefaultView.Sort = "gscitations DESC";
             dataGridView1.DataSource = tempdatatable;
         }
    }
}
foreach (DataRow row in duplicates.Rows)
{
    dataTable.Rows.Remove(row);
}

如果你没有一个唯一的键,你可以尝试切换!duplicates.Rows.Contains(/*specific row*/)duplicates.Rows.IndexOf(/*specific row*/)>0 。 这应该提供足够的替代品。



文章来源: Error in datarow,Collection was modified; enumeration operation might not execute [duplicate]