2016-01-19 82 views
0

如果以前曾詢問過這種情況,我只能看到其他語言的解決方案,並且不知道用什麼正確的c#術語來描述問題。查找並替換多個值對

我有一個List<Person>,其中每個Person對象有一個SiteDepartment字符串屬性。

因爲在不同的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'替換'Single'並適當地處理'null'。 (不要使用'First'或'FirstOrDefault',你不應該*有多個匹配的查找。) – Albireo

+0

如果沒有找到匹配,我可能不會編輯這對(假設沒有匹配表示值是在兩個系統中都是相同的),但對於如何實現這一點非常有用。非常感謝,這是一個非常寶貴的學習經驗。 – EvilDr