11

我有 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;
  }
}
4

3 回答 3

10

您不能在使用 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) );

您也可以将foreach循环替换为for,但您需要在删除元素时正确处理当前索引做额外的工作。

于 2013-03-17T04:58:41.340 回答
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;
    }
}
于 2013-03-17T04:59:29.783 回答
0

我会说你应该创建一个单独的条目表,而不是调用 datatable.Rows.Remove(rows),将行“行”添加到另一个表中。然后,每当行或行迭代时,您运行一个 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. 这应该提供足够的替代品。

于 2013-03-17T05:12:56.933 回答