Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 查找和替换多个值对_C#_Asp.net_.net - Fatal编程技术网

C# 查找和替换多个值对

C# 查找和替换多个值对,c#,asp.net,.net,C#,Asp.net,.net,抱歉如果以前有人问过这个问题,我只能看到其他语言的解决方案,不知道用什么正确的c#术语来描述这个问题 我有一个列表,其中每个人对象都有一个站点和部门字符串属性 由于不同ERP系统的命名约定不同,我需要读取每个人的站点/部门的值,并根据查找表中找到的匹配项,替换它们: 目前我可以这样手动编码: foreach (Person p in pi.People) { if (p.Site == "New York" && p.Department == "HR") {

抱歉如果以前有人问过这个问题,我只能看到其他语言的解决方案,不知道用什么正确的c#术语来描述这个问题

我有一个
列表
,其中每个
对象都有一个
站点
部门
字符串属性

由于不同ERP系统的命名约定不同,我需要读取每个人的站点/部门的值,并根据查找表中找到的匹配项,替换它们:

目前我可以这样手动编码:

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列,在“old”列上有一个索引)

如果有人对更好的方法有好的建议,我很乐意去RTFM。

创建一个查找类:

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;
}
创建查找类:

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

我认为你现有的方法很好——这些是业务规则,对你的问题领域/业务来说是独一无二的,因此你希望这些规则尽可能明确和简单;我很感谢你的意见。这些EF实体是来自SQL吗?嗨,不是,它通过WebApi2的JSON被转换成了一个
Person
对象。对这一次的否决进行一些建设性的批评怎么样?我认为你现有的方法很好——这些是业务规则,是你的问题领域/业务所特有的,因此,您希望规则尽可能明确和简单;我很感谢您的输入。这些EF实体是来自SQL吗?嗨,没有,它通过WebApi2的JSON被转换成
Person
对象。非常好,谢谢。如果找不到查找结果,请稍微修改以生成逻辑路径,这取决于您希望如何处理它。这是不应该发生的事情吗?如果是这样,让
单个
抛出就可以了。否则,您可以将
Single
替换为
SingleOrDefault
,并适当地处理
null
。(不要使用
First
FirstOrDefault
,您不应该有多个匹配查找。)如果没有找到匹配项,我可能不会编辑该对(假设没有匹配项意味着两个系统中的值相同),但了解如何实现这一点非常有用。非常感谢,这是一次非常宝贵的学习经历。非常好,谢谢。如果找不到查找结果,请稍微修改以生成逻辑路径,这取决于您希望如何处理它。这是不应该发生的事情吗?如果是这样,让
单个
抛出就可以了。否则,您可以将
Single
替换为
SingleOrDefault
,并适当地处理
null
。(不要使用
First
FirstOrDefault
,您不应该有多个匹配查找。)如果没有找到匹配项,我可能不会编辑该对(假设没有匹配项意味着两个系统中的值相同),但了解如何实现这一点非常有用。非常感谢,这是一次非常宝贵的学习经历。