2016-01-19 79 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