好的,这就是我正在尝试的事情。
我有一份包含世界上所有国家/地区的下拉列表。 用户选择一个,并将该值传递给case语句, 如果与案件相符,则会发送电子邮件。
我只有四种不同的配方,但我可以有几十种 国家/地区与四个电子邮件中的每一个匹配。例如:
switch (selectedCountry)
{
case "ca":
sendTo = canadaEmail;
break;
case "uk":
case "de":
case "fr"
sendTo = europeanEmail;
break;
case "bb":
sendTo = barbadosEmail;
break;
default:
sendTo = usEmail;
break;
}
我想知道的是,有什么比这更好的方式 一个巨大的案例陈述?
答案 0 :(得分:4)
您可以改用词典:
Dictionary<string, string> sendToEmails = new Dictionary<string, string>();
sendToEmails["bb"] = barbadosEmail;
sendToEmails["ca"] = canadaEmail;
sendToEmails["uk"] = europeanEmail;
sendToEmails["de"] = europeanEmail;
然后使用TryGetValue在需要时获取值:
string sendTo;
if (sendToEmails.TryGetValue(selectedCountry, out sendTo))
{
// Send the email here.
}
此方法的一个优点是您的词典不必硬编码到您的程序中。它可以很容易地来自配置文件或数据库。
如果选择数据库路由,也可以考虑使用LINQ:
string sendTo = dc.CountryEmails
.SingleOrDefault(c => c.Country == selectedCountry);
答案 1 :(得分:2)
你无法解决某个地方,不知何故,你必须枚举这些国家并将它们分配到一个电子邮件地址。您可以通过多种方式执行此操作,无论是数据库,外部XML文件还是内部List对象。
例如:
List<string> europeanEmailCountries = new List<string>();
europeanEmailCountries.AddRange("fr", "de"); // etc
...
if(europeanEmailCountries.Contains(countryCode))
{
sendTo = europeanEmailAddress;
}
通过允许您定义映射到特定电子邮件地址的国家/地区列表,而无需浏览每个可能的条目,这可以为您节省复杂的switch语句。我可能倾向于从XML文件填充列表,而不是硬编码值。
答案 2 :(得分:1)
可以消除案例的几个选项:
答案 3 :(得分:0)
将其外化(XML,数据库,无论你喜欢什么......)并且只实现选择正确的“状态机”。
答案 4 :(得分:0)
是 - 如果您在某处有硬编码列表,请考虑使用自定义类型的集合:
public class MyType
{
public string Code { get; set; }
public string Email { get; set; }
}
然后你可以这样做:
List<MyType> myList = new List<MyType>()
{
new MyType() { Code = "A", Email = "something" },
// etc..
}
string emailAddress = myList.Where(m => m.Code == selectedCountry);
虽然,我会说这是非常差的设计,我鼓励你使用某种rdbms。