繁体   English   中英

C#开关与VB案例陈述

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM