C#开关与VB案例陈述

时间:2013-09-10 07:16:49

标签: c# vb.net switch-statement select-case

我最近从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#中根本不可能做到这一点?

非常感谢你!

5 个答案:

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

假设examScoreint,这有点滥用新的“类型上的模式匹配”工具,以便能够在{{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;
        }