C# 查找和替换多个值对
抱歉如果以前有人问过这个问题,我只能看到其他语言的解决方案,不知道用什么正确的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") {
列表
,其中每个人
对象都有一个站点
和部门
字符串属性
由于不同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
,您不应该有多个匹配查找。)如果没有找到匹配项,我可能不会编辑该对(假设没有匹配项意味着两个系统中的值相同),但了解如何实现这一点非常有用。非常感谢,这是一次非常宝贵的学习经历。