Как мне найти похожие имена столбцов с помощью linq?
Вопрос
Привет, я пытаюсь выучить Linq, поэтому я не уверен, можно ли это сделать.
Я работаю над импортировать проект Поэтому я решил импортировать данные, используя DataSets.
Моя задача на данный момент:Имея 2 таблицы данных с разными схемами, одна из которых содержит мою целевую схему, а другая - мою исходную схему.
Что мне нужно сделать, это выполнить некоторое сопоставление столбцов, где я могу идентифицировать мои исходные столбцы, которые "в чем-то похоже" к моим столбцам назначения.На данный момент я ищу что-то, где, если какая-либо часть имени столбца назначения содержится в источнике, это возможное совпадение Я не знаю ни одного способа определить вероятность.
Например источник [имя, фамилия, адрес] - > пункт назначения [fname, lname, addr1]
Итак, является ли LINQ потенциальным кандидатом на эту работу?Или регулярные выражения?Я начал с этого
Наличие исходного DataTable dt
var Lcols = from c in dt.Columns.Cast<System.Data.DataColumn>()
select c.ColumnName;
Я не уверен, куда идти дальше...
Спасибо!
Решение
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 };
И это даст вам возможные сопоставления, основанные на элементах в словаре.