MAC
MAC

Reputation: 6577

getting non matched values from two Datatable

Is there any direct method for getting non matched values from two data table. I have one datatable which returns all the groups from Active Directory, and another datatable consist of all the group names from sharepoint list. But i need the non matched values by comparing these two datatables. please help me, if it possible.

Thanks in advance.

Upvotes: 0

Views: 2604

Answers (3)

Tim Schmelter
Tim Schmelter

Reputation: 460158

I want compare DataTable1 that not exist in DataTable2

You can use Linq. Very efficient approaches are Enumerable.Except or Enumerable.Join(as LEFT OUTER JOIN) which are using sets:

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);

or the Join approach selecting the whole 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;

Here you can use rowsOnlyInDT1.CopyToDataTable to create a new DataTable of the rows in table1 which are unique/new or use foreach to enumerate them.

Upvotes: 1

Sachin
Sachin

Reputation: 40970

You can use .Except to do this. (Assuming an ID column)

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 );

Upvotes: 1

vc 74
vc 74

Reputation: 38179

You could use DataRowComparer to compare the rows.

For instance, to compare the first rows of 2 data tables:

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

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

Upvotes: 1

Related Questions