【问题标题】:Removing from temporary DataTable if ID meets DataSet.DataTable value如果 ID 满足 DataSet.DataTable 值,则从临时 DataTable 中删除
【发布时间】:2014-05-08 08:16:50
【问题描述】:

我正在研究一种算法来遍历现有的 DataSet.DataTable 和 Temporary - DataTable。

我在循环中放置了一个循环来查找每一行中 ID 的值。如果它们匹配,我希望然后从临时数据表中删除行。 (稍后放入数据网格)

当它找到匹配项并尝试删除它时出现错误;

“集合已修改;枚举操作可能无法执行。”

我认为这是一个不稳定的问题,因为我试图从当前正在使用的 DataTable 中删除,但我想不出解决我的问题的解决方案。

有没有经验更丰富的人帮忙?

int res_index = 0;

foreach (DataRow r in myDataSet.tbl_reservation)
{
    //MessageBox.Show("r" + myDataSet.tbl_reservation.Rows[res_index]["tableID"].ToString());

    int rID = (int)myDataSet.tbl_reservation.Rows[res_index]["tableID"];

    int tmp_index = 0;

    foreach (DataRow t in tmp_table.Rows)
    {
        //MessageBox.Show("t" + tmp_table.Rows[tmp_index]["tableID"].ToString());

        int tID = (int)tmp_table.Rows[tmp_index]["tableID"];

        if (rID == tID)
        {
            tmp_table.Rows.RemoveAt(tmp_index);
        }

        tmp_index++;
    }

    res_index++;
}

【问题讨论】:

    标签: c# for-loop datatable


    【解决方案1】:

    不确定我是否理解正确,但要从临时表中删除元素,您可以应用Select 方法,然后为找到的行调用Delete,最后调用AcceptChanges 以有效删除行

       foreach (DataRow r in myDataSet.tbl_reservation.Rows)
       {
            int rID = (int)r["tableID"];
    
            // Find all the rows with the desidered tableID in temp_table
            DataRow[] toRemove = tmp_table.Select("tableID=" + rID.ToString());
            foreach(DataRow r in toRemove)
                r.Delete();  // Delete doesn't try to remove the row, just marks it as deleted
       }
       // All the rows marked as deleted are effectively removed from the table rows collection
       tmp_table.AcceptChanges();
    

    【讨论】:

      【解决方案2】:

      我相信你正在寻找这样的东西;

      var diff= table1.AsEnumerable().Except(table2.AsEnumerable(),
                                                      DataRowComparer.Default).ToDateTable();
      

      基本上,它会为您提供第一个表中没有第二个表的所有内容。如果 DataRowComparer.Default 与您想要的不匹配,那么您需要定义和相等比较器并将其传递给 except(例如,您可以创建一个仅比较 1 列值的值,我认为默认值将比较每一行中的所有值) .

      【讨论】:

        【解决方案3】:

        您不能在 foreach 循环的中间修改集合

        您必须使用 for 循环或将索引存储到临时存储中并稍后删除

        foreach (DataRow r in myDataSet.tbl_reservation)
        {
        //MessageBox.Show("r" + myDataSet.tbl_reservation.Rows[res_index["tableID"].ToString());
        
        int rID = (int)myDataSet.tbl_reservation.Rows[res_index]["tableID"];
        
        int tmp_index = 0;
        
        for(int tmp_index = 0;tmp_index<tmp_table.Rows.Count;tmp_index++)
        {
            //MessageBox.Show("t" + tmp_table.Rows[tmp_index]["tableID"].ToString());
        
            int tID = (int)tmp_table.Rows[tmp_index]["tableID"];
        
            if (rID == tID)
            {
                tmp_table.Rows.RemoveAt(tmp_index);
                tmp_index--;
            }
        
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-10-13
          • 2020-09-11
          • 1970-01-01
          • 1970-01-01
          • 2017-04-02
          • 1970-01-01
          • 2023-01-19
          • 1970-01-01
          相关资源
          最近更新 更多