4
respostas

Switch Imc C#

É possivel no switch eu ao inves de usar valores para comparar , eu usar expressoes que retornam true ou false nos cases? tipo

switch(imc){ case imc < 18.5: Console.Write("abaixo do peso"); }

eu vi que no php isso funciona mas no java nao, queria saber se no c# da pra fazer dessa forma ao inves de usar varios else ifs

4 respostas

Sim.

int teste = 3;
. switch (2)
. {
.     case var _ when teste >= 3:
.         Console.WriteLine("Sim");
.         break;
.     case var _ when typeof(int) == teste.GetType():
.         Console.WriteLine("Sim2");
.         break;
.     default:
.         break;
. }

O codigo acima vai printar "Sim" e se mudar a int teste para 2, irá printar "Sim2". Caso queira pesquisar mais a fundo sobre a funcionalidade, busque por "c# switch with pattern matching" ou "c# switch case when"

Eu fiz dessa forma só que quando eu inicio a compilação só exibe Peso abaixo do normal, não sei o que estou errando.

 //Declarar variaveis
            double peso, altura, imc;

            //Entrada
            Console.Write("Digite o seu peso: ");
            peso = Convert.ToDouble(Console.ReadLine());

            Console.Write("Digite a sua altura: ");
            altura = Convert.ToDouble(Console.ReadLine());

            //Processamento e Saída
            imc = (peso / (altura * altura));

            switch (imc)
            {
                case var _ when imc <= 18.5:
                    Console.WriteLine("Peso abaixo do normal");
                    break;
                case var _ when imc > 18.5 && imc < 25:
                    Console.WriteLine("Peso normal");
                    break;
                case var _ when imc >= 25 && imc < 30:
                    Console.WriteLine("Sobre o Peso");
                    break;
                case var _ when imc >= 30 && imc < 35:
                    Console.WriteLine("Grau de Obesidade I");
                    break;
                case var _ when imc >= 35 && imc < 40:
                    Console.WriteLine("Grau de Obesidade II");
                    break;
                case var _ when imc >= 40:
                    Console.WriteLine("Grau de Obesidade III");
                    break;

            }

            Console.ReadKey();

Testa em vez de usar os console.readline(), passar o valor fixo no codigo para ver se funciona. Testei no c# interativo do visual studio e o codigo funcionou, porém transformei em um codigo e passei Peso e Altura por parametro

Eu não fiz a aula/curso a que essa pergunta é referente. Você tem possibilidade de debuggar? O melhor seria botar um break point no inicio da função e ir vendo passo a passo o que esta acontecendo