如何过滤掉国家/地区代码?

时间:2010-06-21 20:23:02

标签: c# asp.net oop logic

好的,这就是我正在尝试的事情。

我有一份包含世界上所有国家/地区的下拉列表。 用户选择一个,并将该值传递给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;
}

我想知道的是,有什么比这更好的方式 一个巨大的案例陈述?

5 个答案:

答案 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)

可以消除案例的几个选项:

  1. 将映射存储在数据库中,然后按国家/地区代码查找。
  2. 在您的代码中构建一个地图,其中国家/地区代码为密钥,电子邮件为值。

答案 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。