如何使用linq找到类似的列名?

时间:2009-02-11 18:46:09

标签: regex linq datatable matching

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

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

我的挑战是:拥有2个不同架构的DataTable,其中一个包含我的目标架构,另一个包含我的源架构。

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

例如 来源[名字,姓氏,地址] - >目的地[fname,lname,addr1]

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

拥有源DataTable dt

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

我不知道从哪里开始......

谢谢!

1 个答案:

答案 0 :(得分:1)

LINQ 可以成为候选者,但我认为您需要定义的内容(如果您还没有这样做)是列是如何相似的。什么是截止点?一旦您具有可以将一个列映射到另一个列的条件,就可以将这些条件应用于两个集合的笛卡尔积(来自源的列是第一个集合,而第二个是来自目标的列)到获得潜在匹配列表。


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

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

并且IDictionary<string, string>将源中列的名称映射到目标中的列名称,您可以这样做:

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 };

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