如果该行存在于另一个Datable中,则从Datatable中删除一行

时间:2015-07-15 08:06:14

标签: c#

我有两个具有相同列的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();

但它不起作用:( [它只删除了另一个中不存在的东西]我试图转过来但却给我错误。

任何代码建议?

2 个答案:

答案 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,因此仅保留非重复行。