【问题标题】:How to filter off of a country code?如何过滤掉国家代码?
【发布时间】:2011-03-06 12:27:17
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# asp.net oop logic


    【解决方案1】:

    您可以改用字典:

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

    【讨论】:

    • 嗯,这几乎就是编译器最终使用case 语句所做的事情。
    • 不一定。小的 switch 语句可以编译为 if/else 链。另外,我同意这可能适用于配置文件。
    • 一开始我是这样做的,但发现一对一映射会创建一个非常大的映射列表。我选择了通用列表,因为它会给我一个更精简的版本。感谢您的建议。
    【解决方案2】:

    您无法绕过这样一个事实,即在某个地方,您必须以某种方式枚举国家/地区并将它们分配给一个电子邮件地址。您可以通过多种方式做到这一点,无论是数据库、外部 XML 文件还是内部 List 对象。

    例如:

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

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

    【讨论】:

    • 使用字符串数组和少量 List 列表对我来说非常有用。它允许我将所有相关国家的单个数组添加到列表中,然后只需将我的下拉值传递给 .Contains 方法。工作得很好。谢谢!
    • 太棒了 - 很高兴我能帮上忙! :)
    【解决方案3】:

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

    1. 将映射存储在数据库中并按国家代码查找。
    2. 在您的代码中构建地图,以国家/地区代码为键,电子邮件为值。

    【讨论】:

      【解决方案4】:

      将其外部化(XML、数据库、任何你喜欢的...),并且只实现一个选择正确的“状态机”。

      【讨论】:

        【解决方案5】:

        是的——如果您在某处有硬编码列表,请考虑使用自定义类型的集合:

        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。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-05-27
          • 1970-01-01
          • 1970-01-01
          • 2013-11-29
          • 1970-01-01
          • 1970-01-01
          • 2018-10-16
          相关资源
          最近更新 更多