[英]C# Switches vs. VB Case Statements
我最近从VB切换到C#。 我注意到的一件事是,在C#中,我在使用比较作为案例的一部分时遇到了问题。 我不确定如何用文字解释它,所以这里是我想要做的一个例子。
在VB中,我的代码看起来像这样,并且工作得很好。
Select Case ExamScore
Case Is >= 90
Grade = "A"
Case Is >= 80
Grade = "B"
Case Is >= 70
Grade = "C"
Case Is >= 60
Grade = "D"
Case Else
Grade = "F"
End Select
另一方面,在C#中,Visual Studio告诉我“> =”是一个无效的表达式。
switch (examScore)
{
case >= 90: grade = "A"; break;
case >= 80: grade = "B"; break;
case >= 70: grade = "C"; break;
case >= 60; grade = "D"; break;
default: grade = "F"; break;
}
我在这里做错了什么,或者在C#中根本不可能做到这一点?
非常感谢你提前!
这个答案的顶部部分适用于7之前的C#版本。请参阅下面的版本7更新行
这是不可能的。 C# 开关只能打开完全相等:
每个案例标签指定一个常量值。 控制转移到switch部分,其case标签包含一个与switch表达式的值匹配的常量值,
您可以用一堆if
/ else
语句替换它,或者如果您愿意,可以制作看起来非常紧凑的东西,但有些可能会皱眉 - 一组条件运算符:
grade = examScore >= 90 ? "A" :
examScore >= 80 ? "B" :
examScore >= 70 ? "C" :
examScore >= 60 ? "D" :
"F";
使用C#7, switch
已得到显着增强 ,现在可以在case
应用更多条件,尽管它仍然不像VB版本那样“干净”。 你可以这样做:
switch (examScore)
{
case int es when es >= 90: grade = "A"; break;
case int es when es >= 80: grade = "B"; break;
case int es when es >= 70: grade = "C"; break;
case int es when es >= 60; grade = "D"; break;
default: grade = "F"; break;
}
假设examScore
是一个int
,这有点滥用新的“类型上的模式匹配”工具,以便能够在case
子句中说些什么 ,然后使用when
子句将任意条件应用于新引入的变量。
与VB不同,C#switch语句类似于“equals”检查。 所以你可能需要一个if else梯形来完成这个。
您可以尝试以下方法:
private char Grade(int marks)
{
Dictionary<int, char> grades = new Dictionary<int, char> { { 60, 'A' }, { 50, 'B' } };
foreach (var item in grades)
{
if (marks > item.Key)
return item.Value;
}
return 'C';
}
这在C#中是不可能的。
使用一堆if
而不是。
你可以拥有很好的功能:
public string Grade(int examScore)
{
if(examScore>=90)
{
return "A";
}
if(examScore>=80)
{
return "B";
}
if(examScore>=70)
{
return "C";
}
if(examScore>=60)
{
return "D";
}
return "F";
}
如果你真的想要一个switch语句,你可以使用整数除法
int i = 69;
switch (Math.Min(9, i / 10))
{
case 9: Grade = "A"; break;
case 6: Grade = "B"; break;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.