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

C# 如何通过比较两个数据表获得不匹配的列,c#,linq,datatable,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

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

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");
var differences = dt1.AsEnumerable().Except(dt2.AsEnumerable(),DataRowComparer.Default);
var v = differences.Any() ? differences.CopyToDataTable() : new DataTable();
我知道如何通过编写linq查询来获得不匹配的行,如下所示

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");
var differences = dt1.AsEnumerable().Except(dt2.AsEnumerable(),DataRowComparer.Default);
var v = differences.Any() ? differences.CopyToDataTable() : new DataTable();
但这会给我整行,但我需要的只是具有类似ColumnId的非匹配列

ColumnnId    Column2
   1         TestData1 

还有一点是,我的数据可以在任何列中更改,在这种情况下,我需要列出所有列以及其他不匹配的列。此外,我的列名可能会有所不同,因此我需要动态的代码,以便它能够与指定的任何列名相匹配

,就像user1895086所说的那样,如果ColumnId在表之间是公共的,即您可以根据ID选择每个表中要比较的行,那么您所要做的就是执行双for循环来查找其余信息。我可以在下面提供psuedo代码。最后,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);
                }
            }
        }
Dictionary differencesByField=new Dictionary();
对于差异中的每一行。行
{
var columnId=行的columnId
DataRow otherRow=获取dt2中具有相同列ID的行
DifferenceByField[columnId]=新列表();
对于差异中的每列。列
{
string val=从行中获取列的值
string otherVal=从otherRow获取列的值
如果(val!=其他val)
{
differencesByField[columnId]。添加(col.ColumnName);
}
}
}

您需要一个遗漏加入。请参阅msdn:。常规连接不会为您提供不相等的第二项。有时,你所要做的就是通过将第二行与第一行连接起来,将两个表颠倒过来。如果你已经得到了基于它们不同的事实的行,那么你已经完成了一半。这意味着您的结果数据表(v)已经只包含有差异的行。如果您对该表的Rows集合执行Foreach操作,并使用该行的唯一标识符,则可以找到其匹配项,然后使用另一个循环在列中滚动。您能否为以下情况显示所需输出的示例:存在多个不匹配行(和/或)存在多个不匹配列?