Использует десятичные диапазоны в переключателе, невозможном в C#?

Я только начинаю изучать C#, и я стал упорно продолженным что-то очень простое.

Для моего первого "приложения" я думал, что пойду для чего-то простого, таким образом, я решил для калькулятора BMI.

BMI вычисляется в десятичный тип, который я теперь пытаюсь использовать в операторе переключения, но по-видимому десятичный не может использоваться в переключателе?

Что было бы решением C# для этого:

            decimal bmi = calculate_bmi(h, w);

            switch (bmi) {
                case < 18.5: 
                    bmi_description = "underweight.";
                    break;
                case > 25:
                    bmi_description = "overweight";
                case > 30:
                    bmi_description = "very overweight";
                case > 40:
                    bmi_description = "extreme overweight";
                    break;
            }
18
задан phobia 30 May 2010 в 11:11
поделиться

5 ответов

Оператор switch поддерживает только целочисленные типы (перечисления не перечислены, но могут использоваться с операторами switch , потому что они поддерживаются целочисленным типом) (строки также поддерживаются, как указано Changeling - см. комментарий для справки) и сравнения на равенство с постоянными значениями. Поэтому вы должны использовать некоторые операторы if .

if (bmi < 18.5M)
{
    bmi_description = "underweight.";
}
else if (bmi <= 25)
{
    // You missed the 'normal' case in your example.
}
else if (bmi <= 30)
{
    bmi_description = "overweight";
}
else if (bmi <= 40)
{
    bmi_description = "very overweight";
}
else
{
    bmi_description = "extreme overweight";
}

Между прочим, ваш оператор switch немного утомлен, потому что вы переключаетесь с меньше чем на больше и используете провал без перерывов. Я думаю, что следует использовать только один тип сравнения, чтобы упростить понимание кода или изменить порядок проверок и не использовать провалы.

if (bmi < 18.5M)
{
    bmi_description = "underweight.";
}
else if (bmi > 40)
{
    bmi_description = "extreme overweight";
}
else if (bmi > 30)
{
    bmi_description = "very overweight";
}
else if (bmi > 25)
{
    bmi_description = "overweight";
}
else
{
    // You missed the 'normal' case in your example.
}
14
ответ дан 30 November 2019 в 08:37
поделиться

Ключевое слово switch прекрасно работает с десятичными дробями. Проблемы возникают с < и >.

0
ответ дан 30 November 2019 в 08:37
поделиться

Раздел для дальнейшего чтения, переключатели

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

Измените y на true в первом примере, и переключатель должен работать на 'b'.

Второй пример работает, потому что во втором случае включается постоянное или «константное» значение. Следовательно, вы соответствуете основным критериям или требованиям коммутатора. Хотя многие здесь определенно посоветовали бы вам не писать подобный код. Включите простое постоянное значение и убедитесь, что ваш переключатель точно соответствует каждому из различных значений, которыми может быть указанная вами переменная.

Попробуйте использовать перечисление, чтобы ваш код соответствовал стандартным методам кодирования .Net. Этот комментарий также соответствует требованиям, чтобы убедиться, что вы не приобретаете никаких вредных привычек, если хотите сделать из этого карьеру ???

ПОМНИТЕ: вы можете использовать перечисление и настроить его на использование десятичных значений, поскольку десятичное число является типом значения, поэтому это соответствует критериям того, что требуется для перечисления. Поскольку перечисление определено в платформе .Net как тип значения, поэтому только типы значений, такие как типы на основе чисел, могут быть настроены для создания типа перечисления в пользовательских классах кода yuor.Просто прикрепите каждое значение с именем или каким-либо другим образом, как вы использовали выше, например, избыточный вес и т. Д., И убедитесь, что каждая запись в перечислении имеет логический порядок. то есть записи с точки зрения десятичных значений имеют четкое определение движения вверх или вниз. Как только ваше перечисление настроено, создайте переменную только что созданного типа перечисления, а затем передайте эту переменную своему коммутатору.

Получайте удовольствие от обучения.

1
ответ дан 30 November 2019 в 08:37
поделиться

Вы также можете использовать какую-то коллекцию, в которой хранятся значения отсечения и описания. (Я не специалист по C # ... может быть Dictionary ?) Перебрать его, чтобы найти последний, который меньше вашего bmi, и вернуть его соответствующую метку.

0
ответ дан 30 November 2019 в 08:37
поделиться

Это невозможно с операторами switch в C #.
Причина в том, что после каждого оператора case требуется постоянное выражение.

Также каждое значение допускается только один раз, и тип выражения должен соответствовать типу в вашем переключателе . В вашем случае это не так, потому что вы хотели иметь операторы типа bool case , но десятичное число в вашем переключателе .

Вместо этого рассмотрите возможность рефакторинга с использованием вспомогательной функции:

//...
decimal bmi = calculate_bmi(h, w);
string bmi_description = get_description_for_bmi(bmi);
//...

string get_description_for_bmi(decimal bmi)
{
    string desc;
    if(bmi < 18.5m)
      desc = "underweight";
    else if(bmi <= 25)
      desc = "average";//You forgot this one btw
    else if(bmi <= 30)
      desc = "overweight";
    else if(bmi <= 40)
      desc = "very overweight";     
    else
      desc = "extreme overweight";

    return desc;
}

Дополнительная литература:

Не разрешены не только значения диапазона, но и непостоянные выражения.

Вот пример того, что невозможно:

bool b = true;
bool y = false;
switch (b)
{
    case true:
        break;
    case y:
        break;
}

Однако это возможно:

bool b = true;
const bool y = false;
switch (b)
{
    case true:
        break;
    case y:
        break;
}
9
ответ дан 30 November 2019 в 08:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: