0

嗨,我正在尝试学习 Linq,所以我不确定这是否可以完成。

我正在做一个 导入项目 ,所以我决定使用 DataSets 导入数据。

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

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

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

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

有一个源 DataTable dt

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

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

谢谢!

4

1 回答 1

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

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

于 2009-02-11T18:49:46.700 回答