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操作,并使用该行的唯一标识符,则可以找到其匹配项,然后使用另一个循环在列中滚动。您能否为以下情况显示所需输出的示例:存在多个不匹配行(和/或)存在多个不匹配列?