如何通过比较两个数据表来获得不匹配的列

时间:2017-01-12 18:48:46

标签: c# linq datatable

大家好我有两个数据表如下

DataTable dt1 = new DataTable();
dt1.Columns.Add("ColumnId");
dt1.Columns.Add("Column2");
dt1.Columns.Add("Column3");
dt1.Columns.Add("Column4");

dt1.Rows.Add("1, "TestData", "TestData1", "TestData2");

DataTable dt2 = new DataTable();
dt2.Columns.Add("ColumnId");
dt2.Columns.Add("Column2");
dt2.Columns.Add("Column3");
dt2.Columns.Add("Column4");

dt2.Rows.Add("1, "TestData1", "TestData1", "TestData2");

我知道如何通过编写linq查询来获取不匹配的行,如下所示

var differences = dt1.AsEnumerable().Except(dt2.AsEnumerable(),DataRowComparer.Default);
var v = differences.Any() ? differences.CopyToDataTable() : new DataTable();

但是这给了我整行,但我需要的只是与ColumnId不匹配的列,如

ColumnnId    Column2
   1         TestData1 

还有一点是我的数据可以在任何列中更改,在这种情况下,我需要列出非匹配列的所有列。此外,我的列名称可能会有所不同,因此我需要以动态方式使用代码,以使其与指定的任何列名匹配

1 个答案:

答案 0 :(得分:0)

就像user1895086所说的那样,如果ColumnId在表之间是通用的,即你在ID中选择每个表中要比较的行,那么你所要做的就是做一个double for循环来找到其余的信息。我可以在下面提供伪代码。最后,differenceByField将包含列ID的映射,列表中的列名称不同。

例如:

        Dictionary differencesByField = new Dictionary();

        for each row in differences.Rows
        {
            var columnId = ColumnId of row

            DataRow otherRow = get the row in dt2 with same columnId

            differencesByField[columnId] = new List<string>();

            for each column in differences.Columns
            {
                string val = get value of column from row
                string otherVal = get value of column from otherRow

                if (val != otherVal)
                {
                    differencesByField[columnId].Add(col.ColumnName);
                }
            }
        }