大家好我有两个数据表如下
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
还有一点是我的数据可以在任何列中更改,在这种情况下,我需要列出非匹配列的所有列。此外,我的列名称可能会有所不同,因此我需要以动态方式使用代码,以使其与指定的任何列名匹配
答案 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);
}
}
}