如果ID满足DataSet,从临时数据表中移除.DataTable的价值

本文关键字:DataTable 数据表 满足 ID DataSet 如果 | 更新日期: 2023-09-27 17:55:05

我正在研究一种通过现有数据集循环的算法。数据表和临时数据表。

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

我得到一个错误,当它找到一个匹配并试图删除它;

"Collection was modified;枚举操作可能无法执行。"

我认为这是抛出一个摇摆,因为我试图从一个数据表中删除,目前正在使用,但我想不出一个解决方案来解决我的问题。

有没有更有经验的人来帮帮忙?
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++;
}

如果ID满足DataSet,从临时数据表中移除.DataTable的价值

不确定我是否理解正确,但是要从临时表中删除元素,您可以应用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();

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

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

基本上它给你第一个表中没有在第二个表中的所有东西。如果DataRowComparer.Default不匹配您想要的方式,那么您需要定义和相等比较器并将其传递给except代替(例如,您可以使一个只是比较1列值,我认为默认值将比较每一行中的所有值)。

不能在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--;
    }
}