2016-01-19 4 views
0

Извините, если это было задано ранее, я могу видеть только решения для других языков и не знаю, что означает правильная терминология C#, чтобы описать проблему.Поиск и замена пар с несколькими значениями

У меня есть List<Person>, где каждый Person объект имеет свойство Site и Department строки.

Из-за различных соглашений об именах в различных системах ERP, мне нужно прочитать значение каждого человека сайта/отдела и на основе матч был найден в справочной таблице, замените их:

enter image description here

в настоящее время я могу закодировать это вручную следующим образом:

foreach (Person p in pi.People) 
{ 
    if (p.Site == "New York" && p.Department == "HR") 
    { 
     p.Department = "Human Resources"; 
    } 
    else if (p.Site == "Seattle" && p.Department == "Production") 
    { 
     p.Site = "Redmond"; 
     p.Department = "Prod Ax-Rdm"; 
    } 
    // .... removed for brevity 
} 

Я задавался вопросом, есть ли лучше/умнее способ добиться того же, однако? В таблице поиска около 20 строк и около 700 человек в списке.

Мое внутреннее мышление заключается в том, чтобы идти с DataTable (4 столбца с индексом «старых» столбцов).

Я рад пойти на RTFM, если у кого есть хорошее предложение по лучшему подходу.

+1

Как о некоторая конструктивная критика, чтобы пойти с этим downvote? – EvilDr

+2

Я думаю, что ваш существующий подход в порядке - это бизнес-правила, уникальные для вашего проблемного домена/бизнеса, поэтому вы хотите, чтобы правила были максимально ясными и простыми. – Polyfun

+0

Спасибо; Я ценю ваш вклад. – EvilDr

ответ

3

Создать класс подстановок:

public class MyLookup 
{ 
    public string OldSite { get; set; } 
    public string OldDepartment { get; set; } 
    public string NewSite { get; set; } 
    public string NewDepartment { get; set; } 
} 

Создание таблицы поиска:

var myLookups = new MyLookup[20]; 

myLookups[0] = 
    new MyLookup 
    { 
     OldSite = "foo", 
     OldDepartment = "bar", 
     NewSite = "baz", 
     NewDepartment = "qux" 
    }; 

[…] 

итерацию записи, искать новые значения и обновить запись:

foreach (var person in pi.People) 
{ 
    var myLookup = 
     myLookups 
     .SingleOrDefault(a => 
      a.OldSite == person.Site 
      && a.OldDepartment == person.Deparment); 

    if (myLookup == null) 
    { 
     // Handle a missing lookup accordingly. 
     throw new Exception("Where is my lookup?!"); 
    } 

    person.Site = myLookup.NewSite; 
    person.Deparment = myLookup.NewDepartment; 
} 
+0

Очень приятно, спасибо. Не могли бы вы немного внести изменения, чтобы создать логический путь, если результат поиска не найден? – EvilDr

+2

Это зависит от того, как вы хотите справиться с этим. Это что-то, что должно никогда не происходить? Если да, то пусть «одиночный» бросок в порядке. В противном случае вы можете заменить 'Single' на' SingleOrDefault' и обработать «null» соответствующим образом. (Не используйте 'First' или' FirstOrDefault', вы должны * никогда не иметь более одного совпадающего поиска.) – Albireo

+0

Я, вероятно, не отредактировал бы пару, если совпадение не было найдено (если совпадение не означает, что значения являются то же самое в обеих системах), но очень полезно посмотреть, как это реализовать. Большое вам спасибо, это был очень ценный опыт обучения. – EvilDr

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