我有两个具有相同列的DataTable:
DataTable dt;
DataTable posTable;
有时他们可以有不同数量的行..
我想从表中删除一行,如果它存在于另一个..
我尝试使用此代码:
dt = dt.AsEnumerable().Zip<DataRow, DataRow, DataRow>(posTable.AsEnumerable(), (DataRow modif, DataRow orig) =>
{
if (orig.ItemArray.SequenceEqual<object>(modif.ItemArray))
{
modif.Delete();
}
return modif;
}).CopyToDataTable<DataRow>();
dt.AcceptChanges();
但它不起作用:( [它只删除了另一个中不存在的东西]我试图转过来但却给我错误。
任何代码建议?
答案 0 :(得分:1)
此链接还有关于比较两个表的示例
http://www.codeproject.com/Questions/686406/How-To-Compare-and-delete-datatable-row-using-Csha
或者
我认为这个例子对你有用..
DataTable dt1 = new DataTable();
dt1.Columns.Add("Name");
dt1.Rows.Add("Apple");
dt1.Rows.Add("Banana");
dt1.Rows.Add("Orange");
DataTable dt2 = new DataTable();
dt2.Columns.Add("Name");
dt2.Rows.Add("Apple");
dt2.Rows.Add("Banana");
List<DataRow> rows_to_remove = new List<DataRow>();
foreach (DataRow row1 in dt1.Rows)
{
foreach (DataRow row2 in dt2.Rows)
{
if (row1["Name"].ToString() == row2["Name"].ToString())
{
rows_to_remove.Add(row1);
}
}
}
foreach (DataRow row in rows_to_remove)
{
dt1.Rows.Remove(row);
dt1.AcceptChanges();
}
答案 1 :(得分:1)
是的,您可以使用SequenceEqual
,但必须使用Remove
代替Delete
。如果您使用DataAdapter
,后者会从数据库中删除它们,前者会从表中删除它们。
另一种方法是使用LINQ进行过滤,并在剩余的行上使用CopyToDataTable
:
var rows1 = dt.AsEnumerable();
var rows2 = posTable.AsEnumerable();
dt = rows1
.Where(r1 => !rows2.Any(r2 => r1.ItemArray.SequenceEqual(r2.ItemArray)))
.CopyToDataTable();
由于!rows2.Any
过滤器中的Where
,因此仅保留非重复行。