Как найти похожие имена столбцов, используя linq? - PullRequest
0 голосов
/ 11 февраля 2009

Привет, я пытаюсь выучить Linq, поэтому я не уверен, что это можно сделать.

Я работаю над проектом импорта Поэтому я решил импортировать данные с помощью DataSets.

Моя задача на данный момент: иметь 2 DataTable с другой схемой, одна из которых содержит мою схему назначения, а другая мою исходную схему.

Что мне нужно сделать, так это выполнить сопоставление некоторых столбцов, чтобы я мог определить исходные столбцы, которые "несколько похожи" на мои столбцы назначения. Я ищу что-то в этом месте, где, если какая-либо часть имени столбца назначения содержится в источнике, это возможное совпадение Я не знаю ни одного способа определения вероятности.

Например источник [имя, фамилия, адрес] -> пункт назначения [имя, имя, адрес1]

Итак, является ли LINQ потенциальным кандидатом на эту работу? Или регулярные выражения? Я начал с этого

Наличие источника DataTable dt

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

Я не уверен, куда идти отсюда ...

Спасибо!

1 Ответ

1 голос
/ 11 февраля 2009

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

И это даст вам возможные отображения, основанные на элементах в словаре.

...