Как сравнить значения из текстового поля в операторе switch? - PullRequest
0 голосов
/ 17 октября 2019

Я новичок в C #, и я пытаюсь сравнить значение в текстовом поле (которое должно быть N, S, E или W), а затем использовать инструкцию switch для определения стоимости пакета на основезона, напечатанная в указанном текстовом поле.

decimal N = 27;
decimal S = 36;
decimal E = 45;
decimal W = 54;
decimal ZoneCost = 0;

switch (textboxZone.Text)
{
    case N:
      ZoneCost = 27;
      break;

    case S:
      ZoneCost = 36;
      break;    

    etc.
}

Я хочу, чтобы переменная ZoneCost изменялась в зависимости от того, какая буква (или «зона») набрана. Я получаю сообщение об ошибке, говорящее, что это можетнеявно преобразует десятичную в строку.

Ответы [ 2 ]

3 голосов
/ 17 октября 2019

Хорошее место для использования новых выражений переключателя C # 8.0:

int cost = textboxZone.Text switch {
    "N" => 27,
    "S" => 36,
    "E" => 45,
    "W" => 54,
    _ => throw new Exception("not valid input")
};

Причина, по которой ваш код не работает, заключается в том, что вы сравниваете строку (textboxZone.Text) с десятичной (переменные N, S, E, W). Бросайте двойные кавычки вокруг пунктов вашего переключателя:

case "N":
0 голосов
/ 17 октября 2019

В более родном / более близком к металлическому языку стиля C-Style такая проверка могла бы сработать. Если вы выбрали правильные значения ASCII / Unicode, то есть.

Как правило, сравнение строк является финишным, и боль в спине. Проблемы начинаются с обсадной колонны, проходят через пробелы и заканчиваются нормализацией. Что касается обработки в любой форме, то единственный тип хуже , чем строка, о которой я могу думать, это необработанный двоичный файл. Я избегаю этого. Даже если бы я был тем, кто написал это в пользовательском интерфейсе, я предпочел бы получать входные данные другим способом / другим форматом. Это просто зло при работе с пользователем или службой XML / Rest / аналогичной.

Я бы организовал пару букв / цифр в структуру, класс или tupel, называемую PackageSize. Создайте массив списка PackageSize. Затем предоставьте пользовательскому интерфейсу ComboBox с отключенным ручным вводом. Заполните CB из массива, каждая запись, используя букву для отображения и ArrayIndex в качестве значения. И тогда заботятся только о выбранном значении, а не о том, что отображается для дальнейшей обработки. ComboBoxes может дать вам хорошее и надежное целое число, которое можно использовать для поиска значений в коллекции, из которой оно было построено.

Переключатель / регистр, выполняющий сопоставление строк, может сработать и, вероятно, сейчас проще идостаточно надежно, если вы придерживаетесь английских букв. Но я избегаю давать пользователю возможность вводить то, что я не могу обработать. И после того, как вы создали соответствующий интерфейс ввода / вывода, массивы значений легче расширять в долгосрочной перспективе.

...