DataTable 列比较并将差异写入另一列

DataTable column compare and write differences to a another column

我正在用 c# 编写一个应用程序,自动比较两个不同数据库中的值。

数据在两个 .xlsx 文件中提供。这些由最终用户加载到应用程序中。然后从这两个文件创建内存中的数据表。一人一份。

现在我需要比较 DataTable 1 的第 1 列和 DataTable 2 的第 3 列。 内容的顺序不一样,但它们都是,总是数值。 有几种可能的结果:

我考虑过创建一个接受两个参数的函数。两个数据表。然后将在 table 的第一列和 table 的第三列进行比较 3.

我正在研究的另一个解决方案现在通过 ClosedXML 将两个数据表粘贴到工作表中。将相关列(1 和 3)提取到另一个单独的工作表,并使用 for each 循环比较两个工作表中的所有单元格并获取差异。但是我不知道如何继续将不在第 1 列中但在第 3 列中的内容获取到工作表 A 以及在第 1 列中但不在第 3 列中的内容到工作表 B.

您可以使用 Linq 查找第 1 列而不是第 3 列中的内容,反之亦然。

您只需在您的项目引用中添加 System.Data.DataSetExtensions,例如 here

然后是 Linq 查询:

var dataTable1 = new DataTable();
dataTable1.Columns.Add(new DataColumn("Data Column 1"));

dataTable1.Rows.Add(1, "", "");
dataTable1.Rows.Add(3, "", "");
dataTable1.Rows.Add(5, "", "");
dataTable1.Rows.Add(7, "", "");
dataTable1.Rows.Add(9, "", "");

var dataTable2 = new DataTable();
dataTable2.Columns.Add(new DataColumn("Data Column 1"));
dataTable2.Columns.Add(new DataColumn("Data Column 2"));
dataTable2.Columns.Add(new DataColumn("Data Column 3"));

dataTable2.Rows.Add("", "", 1);
dataTable2.Rows.Add("", "", 2);
dataTable2.Rows.Add("", "", 4);
dataTable2.Rows.Add("", "", 6);
dataTable2.Rows.Add("", "", 7);
dataTable2.Rows.Add("", "", 8);
dataTable2.Rows.Add("", "", 9);

// Use the id of the column
var column1 = dataTable1.AsEnumerable().Select(r => r.ItemArray[0]).ToList();
var column3 = dataTable2.AsEnumerable().Select(r => r.ItemArray[2]).ToList();

// Use the name of the column
var column1WithName = dataTable1.AsEnumerable().Select(r => r.Field<string>("Data Column 1")).ToList();
var column3WithName = dataTable2.AsEnumerable().Select(r => r.Field<string>("Data Column 3")).ToList();

// All element of the Column 1 (DataTable1) that are not in Column 3 (DataTable2)
var column1Without3 = column1.Except(column3).ToList(); // [ "3", "5" ]
// All element of the Column 3 (DataTable2) that are not in Column 1 (DataTable1)
var column3Without1 = column3.Except(column1).ToList(); // [ "2", "4", "6", "8" ]