Валидация - поиск определенных комбинаций значений - PullRequest
0 голосов
/ 05 февраля 2010

Я делаю некоторую проверку, где мне нужно проверить определенные комбинации между двумя значениями. Например, если string1 - это «фрукты», допустимыми значениями для string2 являются «яблоко», «банан» и «груша». В настоящее время я делаю это:

switch(string1)
{
  case "fruit":
    if(string2 != "apple" && string2 != "banana")
    {
      return false;
    }
    break;
  case "meat":
    if(string2 != "beef" && string2 != "pork")
    {
      return false;
    }
  default:
    return true;
    break;
}

Это действительно два вопроса. Во-первых, есть ли хороший способ сделать что-то вроде этого:

switch(string1)
{
  case "fruit":
    if(string2 NOT IN ("apple", "banana"))
    {
      return true;
    }
    break;
  case "meat":
    if(string2 NOT IN ("beef", "pork"))
    {
      return false;
    }
  default:
    return true;
    break;
}

Вторая часть этого вопроса, скорее всего, ответит первой: есть ли лучший / лучший способ сделать это? Я не самый удивительный кодер в мире, и это первое решение "вне головы", так что я, безусловно, открыт для лучших. Спасибо!

Ответы [ 5 ]

2 голосов
/ 05 февраля 2010

Вот способ использования Linq:

Dictionary<string, IList<string>> validValues = new Dictionary<string, IList<string>>() 
{ 
    { "fruit", new List<string>() { "apple", "banana" } }, 
    { "meat", new List<string>() { "pork", "beef" } } 
};

if (validValues.FirstOrDefault(x => x.Key == string1 && x.Value.Contains(string2)).Value != null)
{
    return true;
}

return false;
2 голосов
/ 05 февраля 2010

Да, есть лучший способ. Вы хотите создать карту, которая связывает вашу «категорию» («фрукты») со строкой списка ваших элементов («яблоко», «банан» и т. Д.). Затем вы хотите найти строку "string1" в приведенном выше примере на карте и посмотреть, содержит ли связанная строка строка List () вашу строку "string2".

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

2 голосов
/ 05 февраля 2010

Вариант ответа Ника. Создайте два списка и используйте против них метод содержимого.

public List<string> Fruit = new List<string>{"apple", "banana"};
public List<string> Meat = new List<string>{"beef", "pork"};

switch (string1)
{
    case "fruit":
        return Fruit.Contains(string2);
    case "meat":
        return Meat.Contains(string2);
}
0 голосов
/ 05 февраля 2010

Вы можете сделать что-то вроде этого:

Dictionary<string, string> map  = new Dictionary<string, string>();

map.add("banana", "fruit");
map.add("apple", "fruit");
map.add("pear", "fruit");

map.add("beef", "meat");
map.add("pork", "meat");


if(map[string2] == string1)
    return true;
0 голосов
/ 05 февраля 2010

Вы можете сократить свои дела до:

switch(string1)
{
  case "fruit":
    return  new[] { "apple", "banana" }.Contains(string2);
  case "meat":
    return  new[] { "beef", "pork" }.Contains(string2);
  default:
    return true;
    break;
}

Я думаю, что стиль в значительной степени зависит от личного вкуса. Это мой вкус ... Я думаю, что легко добавить новое значение с помощью стиля массива, с минимальными накладными расходами (полагаю, кто-то не стесняется меня поправлять), которые вы можете получить с помощью стиля массива / коллекции " проверка типа if-in.

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