Как отфильтровать код страны? - PullRequest
3 голосов
/ 22 июня 2010

Хорошо, вот что я пытаюсь сделать.

У меня есть выпадающий список со всеми странами мира.Пользователь выбирает один, и это значение передается в выписку по регистру, если он совпадает с регистром, отправляется электронное письмо.

У меня только четыре разных получателя, но у меня может быть до десятков стран для сопоставленияс каждым из четырех писем.Например:

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 ]

4 голосов
/ 22 июня 2010

Вместо этого вы можете использовать словарь:

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);
2 голосов
/ 22 июня 2010

Нельзя обойти тот факт, что где-то вам придется перечислять страны и назначать им адреса электронной почты. Вы можете сделать это любым количеством способов, будь то база данных, внешний файл XML или внутренний объект List.

Например:

List<string> europeanEmailCountries = new List<string>();
europeanEmailCountries.AddRange("fr", "de"); // etc

...

if(europeanEmailCountries.Contains(countryCode))
{
    sendTo = europeanEmailAddress;
}

Это спасает вас от сложного оператора переключения, позволяя вам определить список стран, сопоставленных с определенным адресом электронной почты, без прохождения каждой потенциальной записи. Возможно, я склонен заполнять список из файла XML вместо жесткого кодирования значений.

1 голос
/ 22 июня 2010

Пара вариантов, исключающих случаи:

  1. Сохраните сопоставления в базе данных и найдите их по коду страны.
  2. Создайте карту в своем коде со странойкод в качестве ключа и адрес электронной почты в качестве значения.
0 голосов
/ 22 июня 2010

Да - если у вас где-то есть жестко закодированный список, рассмотрите возможность использования коллекции пользовательского типа:

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.

0 голосов
/ 22 июня 2010

Выполните экстернализацию (XML, база данных, все что угодно ...) и реализуйте только «конечный автомат», который выбирает правильный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...