代码之家  ›  专栏  ›  技术社区  ›  Chris

如何过滤掉国家代码?

  •  3
  • Chris  · 技术社区  · 14 年前

    好吧,这就是我要做的。

    我和世界上所有的国家都有一个下拉列表。 用户选择一个值,并将该值传递给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 回复  |  直到 14 年前
        1
  •  2
  •   Seb Charrot    14 年前

    你不能回避这样一个事实:在某个地方,不知何故,你必须列举这些国家,并将它们分配到一个电子邮件地址。您可以通过任何方式来实现这一点,无论是数据库、外部XML文件还是内部列表对象。

    例如:

    List<string> europeanEmailCountries = new List<string>();
    europeanEmailCountries.AddRange("fr", "de"); // etc
    
    ...
    
    if(europeanEmailCountries.Contains(countryCode))
    {
        sendTo = europeanEmailAddress;
    }
    

    通过允许您定义映射到特定电子邮件地址的国家/地区列表,而无需遍历每个潜在条目,这可以节省复杂的switch语句。不过,我可能倾向于从XML文件填充列表,而不是硬编码值。

        2
  •  4
  •   Mark Byers    14 年前

    您可以使用字典:

    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);
    
        3
  •  1
  •   Eric Petroelje    14 年前

    有几个选项可以消除这种情况:

    1. 将映射存储在数据库中,并按国家代码查找它们。
    2. 在代码中构建一个以国家代码为键,电子邮件为值的地图。
        4
  •  0
  •   Lucero    14 年前

    具体化它(XML、数据库、任何你喜欢的东西…)并且只实现一个选择正确的“状态机”。

        5
  •  0
  •   Ian P    14 年前

    是--如果在某个地方有一个硬编码列表,请考虑使用自定义类型的集合:

    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。