从两个Datatable获取不匹配的值

时间:2013-05-29 07:30:14

标签: c# datatable comparison

是否有任何直接方法可以从两个数据表中获取不匹配的值。我有一个数据表从Active Directory返回所有组,另一个数据表包含sharepoint列表中的所有组名。但我需要通过比较这两个数据表来获得非匹配值。如果可能的话,请帮助我。

提前致谢。

3 个答案:

答案 0 :(得分:1)

您可以使用DataRowComparer来比较行。

例如,要比较2个数据表的第一行:

DataRow left = table1.Rows[0];
DataRow right = table2.Rows[0];

IEqualityComparer<DataRow> comparer = DataRowComparer.Default;
bool bEqual = comparer.Equals(left, right);

答案 1 :(得分:1)

您可以使用.Except执行此操作。 (假设ID列)

IEnumerable<int> idsInDataTableA = dataTableA.AsEnumerable().Select(row => (int)row["ID"]);
IEnumerable<int> idsInDataTableB = dataTableB.AsEnumerable().Select(row => (int)row["ID"]);
IEnumerable<int> difference = idsInDataTableA.Except(idsInDataTableB );

答案 2 :(得分:1)

  

我想比较DataTable2中不存在的DataTable1

您可以使用Linq。使用集合的非常有效的方法是Enumerable.ExceptEnumerable.Join(如LEFT OUTER JOIN):

var keyColRows = dt1.AsEnumerable()
    .Select(r => r.Field<int>("KeyColumn")
    .Except(dt2.AsEnumerable().Select(r2 => r2.Field<int>("KeyColumn"));

foreach(int inTable2Missing)
    Console.WriteLine(inTable2Missing);

Join方法选择整个DataRow

var rowsOnlyInDT1 = from r1 in dt1.AsEnumerable()
                    join r2 in dt2.AsEnumerable()
                    on r1.Field<int>("KeyColumn") equals r2.Field<int>("KeyColumn") into groupJoin
                    from subRow in groupJoin.DefaultIfEmpty()
                    where subRow == null
                    select r1;

在这里,您可以使用rowsOnlyInDT1.CopyToDataTable在table1中创建唯一/ new的新DataTable行,或使用foreach枚举它们。