7

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

非常感谢您!

4

5 回答 5

12

此答案的顶部对于 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得到了显着增强,现在可以在cases 中应用更多条件,尽管它仍然不如 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,这有点滥用新的“类型上的模式匹配”工具,以便能够在子句中说些什么case,然后使用when子句将任意条件应用于新引入的变量。

于 2013-09-10T07:19:02.177 回答
3

与 VB 不同,C# switch 语句类似于“等于”检查。因此,您可能需要一个 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';
}
于 2013-09-10T07:20:56.537 回答
2

这在 C# 中是不可能的。

使用一堆ifs 代替。

于 2013-09-10T07:18:35.070 回答
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";
}
于 2013-09-10T07:19:25.563 回答
1

If you really want a switch statement you could use integer division

        int i = 69;
        switch (Math.Min(9, i / 10))
        {
            case 9: Grade = "A"; break;
            case 6: Grade = "B"; break;
        }
于 2013-09-10T07:43:19.773 回答