在 C# 中比较两个数据表的列名

Posted

技术标签:

【中文标题】在 C# 中比较两个数据表的列名【英文标题】:Compare Columns name of Two DataTable in C# 【发布时间】:2020-12-18 04:35:58 【问题描述】:

我有两个数据表,

    dtSchema由ms-access数据库填充的数据表 tabledatatable由excel表格填写

table 必须有四个名为(SN、FN、DOB、Sec)的列

我想将table 的列名与dtSchema 的列名进行比较。 table 中与dtSchema 不匹配的列放在列表中。

foreach (DataColumn col in table.Columns)

       isColumnMatch = false;
       foreach(DataColumn colDb in dtSchema.Columns)
       
             if(col.ColumnName == colDb.ColumnName)
             
             
       

我可以比较数据表的列名。如果table以上四列与dtSchema匹配,而table多于四列,则不匹配的列必须放在列表中。

【问题讨论】:

有什么问题? “找不到区别”是什么意思? 您可以使用以下方法枚举 DataTable 的列: string[] names = dt.Columns.Cast().Select(x => x.ColumnName).ToArray(); 【参考方案1】:

可以通过一个简单的 LINQ 查询来实现,例如:

var tableColumnNames = table.Columns.Cast<DataColumn>().Select(c=>c.ColumnName).ToList();
var schemaColumnNames = dtSchema.Columns.Cast<DataColumn>().Select(c=>c.ColumnNames).ToList();

var unmatchedColumnNames = 
    from col in tableColumnNames where !schemaColumnNames.Contains(col) select col;

【讨论】:

我们在这里检查四个必要的列(SN、FN、DOB、Sec)。 它将集合与参考集进行比较,我不知道您所说的必要列是什么意思。 这四列是必须的。 dtSchema 有这些列。但我想检查table 是否有这四列 你试过我提供的代码了吗?它返回存在于表中而不存在于 dtSchema 中的列,您可以切换这两个列表以具有存在于 dtSchema 但表中不存在的列。如果你想要所有的差异,你可以为双方做它并加入结果。 一种方法是将这些列添加到另一个列表中,并为该列表重复上述操作。【参考方案2】:

为此,您需要使用任何集合来保存所有不匹配的列,因此如果 columnName 或 title 不匹配,则必须将其推送到某个列表。所以最后,你会得到一个不匹配列的列表

===== 更新======

var filter= from firstDt in dt1.AsEnumerable()
        where !(from secondDt in dt2.AsEnumerable() select secondDt["Name"]).Contains(firstDt["Name"].ToString()) select firstDt; DataTable resultDt = filter.CopyToDataTable();

【讨论】:

使用 LINQ 处理两个表中不匹配的“名称”字段。相应地更新我的答案。 在 linq 查询中我在哪里得到Name?你在 linq 中写了 "Name"

以上是关于在 C# 中比较两个数据表的列名的主要内容,如果未能解决你的问题,请参考以下文章

如何比较两个忽略列名的数据框?

将数据表中的列名映射到 C# 中的另一个数据表

c#中同一个Datatable中的如何把重复的记录合并起来,

如何在 MS Access 中使用 C# 获取所有表名和列名?

Pyspark DataFrame:查找两个 DataFrame 之间的差异(值和列名)

使用列名从excel中读取数据并插入到C#中的SQL表中