2009-02-11 3 views
0

Привет, я пытаюсь изучить Linq, поэтому я не уверен, что это можно сделать.Как найти похожие имена столбцов с помощью linq?

Я работаю над import projectИтак, я решил импортировать данные с помощью DataSets.

Мой вызов на данный момент: наличие 2 таблиц данных с другой схемой, одна из которых содержит мою схему назначения, а другая - мою исходную схему.

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

Для примера источника [FirstName, LastName, адрес] -> назначения [Fname, LName, addr1]

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

Имея исходный DataTable дт

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

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

Спасибо!

ответ

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

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

+0

Это интересная идея. Чтобы иметь возможность выбирать любую возможную комбинацию из каждого имени столбца на обеих таблицах, а затем делать соединение. Я не уверен, как это сделать. Я думаю о серии циклов, чтобы построить мой набор, но должен быть более эффективный способ. – kiev

+0

Предположим, что у меня была хэш-таблица или таблица, в которой содержались наиболее распространенные имена столбцов источника и адресата, как бы мне построить мой запрос? – kiev

+0

@kiev: Добавлен ответ, чтобы отразить комментарии. – casperOne

Смежные вопросы