带有多个ifs的C#Switch语句计算一系列数字

时间:2018-01-17 00:49:41

标签: c# .net

我是C#的新手,我正在.net中制作一个Windows窗体,我正在使用以下开关语句来计算候选人的BMI。在测试该程序之后,它将执行第一个案例,但是以下情况不起作用。

感谢您的帮助。 -Mike

其中SwitchFinal是计算的BMI,而Age是保持用户年龄的变量

  int switchvar = 1;
               switch (switchvar)
               {

                   case 1:
                    if (Age >= 17 && Age < 21 && SwitchFinal < 20)
                    {

                        MessageBox.Show("Candidate is Eligible!");

                    }
                    else
                    {
                        MessageBox.Show("Candidate is Not Eligible");
                    }
                    break;

                case 2:
                    if (Age >= 21 && Age < 28 && SwitchFinal < 22)
                    {

                        MessageBox.Show("Candidate is Eligible!");

                    }
                    else
                    {
                        MessageBox.Show("Candidate is Not Eligible");
                    }
                    break;
                case 3:
                    if (Age >= 28 && Age <40 && SwitchFinal < 24)
                    {

                        MessageBox.Show("Candidate is Eligible!");

                    }
                    else
                    {
                        MessageBox.Show("Candidate is Not Eligible");
                    }
                    break;

                case 4:
                    if (Age >= 40 &&  SwitchFinal < 24)
                    {

                        MessageBox.Show("Candidate is Eligible!");

                    }
                    else
                    {
                        MessageBox.Show("Candidate is Not Eligible");
                    }
                    break;

3 个答案:

答案 0 :(得分:2)

您似乎有四个数据用例,您需要检测所有这些用例。这并不意味着你需要开关/箱子。并非所有用例都与switch case的用法相对应;事实上,根本没有理由建立这种联系。您只需要使用if表达式检查所有四个用例。

您的代码应该看起来更像这样:

public bool IsEligible()
{
    if (Age >= 17 && Age < 21 && SwitchFinal < 20)
    {
        return true;
    }
    if (Age >= 21 && Age < 28 && SwitchFinal < 22)
    {
        return true;
    }
    if (Age >= 28 && Age <40 && SwitchFinal < 24)
    {
        return true;
    }
    if (Age >= 40 &&  SwitchFinal < 24)
    {
        return true;
    }
    return false;
}

void ExampleUsage()
{
    bool ok = IsEligible();
    if (ok)
    {
        MessageBox.Show("Candidate is Eligible!");
    }
    else
    {
        MessageBox.Show("Candidate is not Eligible!");
    }
}

如果您想要聪明并尽可能地编写最短的代码,您也可以这样做:

public bool IsEligible()
{
    if (Age < 17) return false;
    if (SwitchFinal < 20) return Age < 21; 
    if (SwitchFinal < 22) return Age < 28;
    if (SwitchFinal < 24) true;
    return false;
}

或者如果你想要更具可扩展性的东西,定义一个包含一系列函数的列表来评估每个案例,并使用LINQ搜索匹配:

//using System;
//using System.Linq;
//using System.Collections.Generic;

List<Func<int,int,bool>> useCases = new List<Func<int,int,bool>>
{
    (age, switchFinal) =>  switchFinal < 20 && age >= 17 && age < 21,
    (age, switchFinal) =>  switchFinal < 22 && age >= 17 && age < 28,
    (age, switchFinal) =>  switchFinal < 24 && age >= 28 && age < 40,
    (age, switchFinal) =>  switchFinal < 24 && age >= 40
};

public bool IsEligble(int age, int switchFinal)
{
    return useCases.Where
    (
        func => func(age, switchFinal)
    )
    .Any();
}

如果由于某种原因确实需要案例编号,您可以轻松修改上述内容以将其返回。然后,要确定是否符合资格,请检查有效的案例编号(非零)。

private Dictionary<int, Func<int,int,bool>> useCases = new Dictionary<int,Func<int,int,bool>>
{
    { 1, (age, switchFinal) =>  (age >= 17 && age < 21 && switchFinal < 20) },
    { 2, (age, switchFinal) =>  (age >= 17 && age < 28 && switchFinal < 22) },
    { 3, (age, switchFinal) =>  (age >= 28 && age < 40 && switchFinal < 24) },
    { 4, (age, switchFinal) =>  (age >= 40 && switchFinal < 24) }
};

public int GetCaseNumber(int age, int switchFinal)
{
    return useCases
        .Where( entry => entry.Value(age, switchFinal) )
        .Select( entry => entry.Key )
        .OrderBy( a => a )
        .FirstOrDefault();
}

void ExampleUsage()
{
    var caseNumber = GetCaseNumber(int.Parse(this.txtAge.Text), int.Parse(this.txtSwitchFinal.Text));
    if (caseNumber == default(int))
    {
        MessageBox.Show("You are not eligble.");
    }
    else
    {
        MessageBox.Show(string.Format("You are eligble under case {0}.", caseNumber));
    }
}

答案 1 :(得分:0)

开关盒设置实际上不是为范围构建的,如果你想要这种效果,你需要在开关盒之前转换你的范围,但是,因为你需要在if else语句中这样做,所以没有很多用于切换后的情况。

喜欢:

int switchRange = 0;
if(Age >= 17 && Age < 21)
{ switchRange = 1}
if (Age >= 21 && Age < 28)
{ switchRange = 2}
if (Age >= 28 && Age < 40)
{ switchRange = 3}
if (Age >= 40)
{ switchRange = 4}

switch(switchRange)
{
   case 1:{
if(SwitchFinal < 20)
{

                        MessageBox.Show("Candidate is Eligible!");

                    }
                    else
                    {
                        MessageBox.Show("Candidate is Not Eligible");
                    }
break;}
case 2:{
if(SwitchFinal < 22)
{

                        MessageBox.Show("Candidate is Eligible!");

                    }
                    else
                    {
                        MessageBox.Show("Candidate is Not Eligible");
                    }
break;}
}
case 3: case 4:{
if(SwitchFinal < 24)
{

                        MessageBox.Show("Candidate is Eligible!");

                    }
                    else
                    {
                        MessageBox.Show("Candidate is Not Eligible");
                    }
break;}

这是我最好的选择。

答案 2 :(得分:-1)

听起来你想要迭代每个案例是否正确?如果是这样,那么switch语句有点奇怪。但是,您可以将整个switch语句括在for循环中

for (switchvar = 1; switchvar <= 4; switchvar++) {//your code}