我最近从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#中根本不可能做到这一点?
非常感谢你!
答案 0 :(得分:12)
此答案的上半部分适用于7之前的C#版本。请参阅下面第7版更新的行
这是不可能的。 C#switches只能打开完全相等:
每个案例标签指定一个常量值。控制转移到switch部分,其case标签包含一个与switch表达式的值匹配的常量值
你可以用一堆if
/ else
语句替换它,或者如果你愿意,你可以制作看起来非常紧凑的东西,但有些人可能会皱眉 - 一组条件运算符:
grade = examScore >= 90 ? "A" :
examScore >= 80 ? "B" :
examScore >= 70 ? "C" :
examScore >= 60 ? "D" :
"F";
使用C#7,switch
已经significantly enhanced,现在可以在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
,这有点滥用新的“类型上的模式匹配”工具,以便能够在{{1}中说出某些内容 }}子句,然后使用case
子句将任意条件应用于新引入的变量。
答案 1 :(得分:3)
与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';
}
答案 2 :(得分:2)
在C#中不可能。
使用一堆if
代替。
答案 3 :(得分:1)
你可以拥有很好的功能:
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";
}
答案 4 :(得分:1)
如果你真的想要一个switch语句,你可以使用整数除法
int i = 69;
switch (Math.Min(9, i / 10))
{
case 9: Grade = "A"; break;
case 6: Grade = "B"; break;
}