在 C# 中比较两个数据表的列名
Posted
技术标签:
【中文标题】在 C# 中比较两个数据表的列名【英文标题】:Compare Columns name of Two DataTable in C# 【发布时间】:2020-12-18 04:35:58 【问题描述】:我有两个数据表,
dtSchema
由ms-access数据库填充的数据表
table
datatable由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可以通过一个简单的 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#中同一个Datatable中的如何把重复的记录合并起来,
如何在 MS Access 中使用 C# 获取所有表名和列名?