【问题标题】:How do I find similar column names using linq?如何使用 linq 找到相似的列名?
【发布时间】:2010-10-06 23:54:29
【问题描述】:

您好,我正在尝试学习 Linq,所以我不确定是否可以这样做。

我正在处理import project 所以我决定使用 DataSets 导入数据。

此时我的挑战:拥有 2 个具有不同架构的数据表,其中一个包含我的目标架构,另一个包含我的源架构。

我需要做的是执行一些列匹配,以便我可以识别与目标列“有点相似”的源列。我现在正在寻找一些东西,如果目标列名的任何部分包含在源中,这可能是匹配我不知道有什么方法可以确定可能性。

例如 源 [firstname, lastname, address] -> 目标 [fname, lname, addr1]

那么,LINQ 是这份工作的潜在候选人吗?还是正则表达式?我从这个开始

有一个源 DataTable dt

var Lcols = from c in dt.Columns.Cast<System.Data.DataColumn>()
select c.ColumnName;

我不知道从这里去哪里......

谢谢!

【问题讨论】:

    标签: regex linq datatable matching


    【解决方案1】:

    LINQ 可能 是这里的候选者,但我认为您需要定义(如果您还没有这样做的话)是列如何相似。什么是分界点?一旦有了可以将一列映射到另一列的条件,就可以将这些条件应用于两组的笛卡尔积(源中的列是第一个集合,而第二个是目标的列)获取潜在匹配列表。


    假设您有源列和目标列,如下所示:

    IEnumerable<DataColumn> sourceColumns = 
      sourceDt.Columns.Cast<System.Data.DataColumn>();
    IEnumerable<DataColumn> destColumns =
      destDt.Columns.Cast<System.Data.DataColumn>();
    

    还有一个 IDictionary&lt;string, string&gt; 将源中的列名映射到目标中的列名,您可以这样做:

    var map =
      from s in sourceColumns
      from d in destColumns
    where
      // colMap is the IDictionary<string, string>
      // The map has to contain the key.
      colMap.ContainsKey(s.ColumnName) &&
    
      // The destination column has to match the column map.
      // The OrdinalIgnoreCase option means to ignore case.
      string.Compare(colMap[s.ColumnName], 
          d.ColumnName, CompareOptions.OrdinalIgnoreCase) == 0
    select
      new { SourceColumn = s, DestinationColumn = d };
    

    这将为您提供基于字典中项目的可能映射。

    【讨论】:

    • 这是一个有趣的想法——能够从两个表的每个列名中选择所有可能的组合,然后进行连接。我不知道该怎么做。我正在考虑一系列循环来构建我的集合,但必须有更有效的方法。
    • 假设我有一个哈希表或表,其中包含最常见的源列名称和目标,那么我将如何构建我的查询?
    • @kiev:附加答案以反映 cmets。
    猜你喜欢
    • 2012-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    相关资源
    最近更新 更多