您好我正在尝试学习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;
我不知道从哪里开始......
谢谢!
答案 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 };
这将根据字典中的项目为您提供可能的映射。