2013-05-29 67 views
0

是否有任何直接的方法從兩個數據表中獲取不匹配的值。我有一個數據表,它返回來自Active Directory的所有組,另一個數據表由來自sharepoint列表的所有組名組成。但我通過比較這兩個數據表需要非匹配值。請幫助我,如果可能的話。從兩個數據表中獲取不匹配的值

在此先感謝。

+1

您是否想要DataTable2中不存在的所有DataTable1,DataTable1中不存在的所有DataTable2中的所有數據嗎?什麼專欄決定重複?你想要什麼結果,DataRow或關鍵列? –

+0

@TimSchmelter:我想比較DataTable2中不存在的DataTable1 – MAC

回答

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

您可以使用.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); 
1

我想比較DataTable1在DataTable2

您可以使用LINQ不存在。非常有效的方法是Enumerable.Except或(爲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創造一個新的DataTable table1中的行是唯一的/新的,或者使用foreach來枚舉它們。

相關問題