我是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;
答案 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}