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