C#如何使用带开关的枚举

yes*_*man 64 c# enums switch-statement switch-expression

我无法弄清楚如何将开关与枚举结合使用.你能告诉我我做错了什么,以及如何解决它?我必须使用枚举来制作一个基本的计算器.

public enum Operator
{
    PLUS, MINUS, MULTIPLY, DIVIDE
}

public double Calculate(int left, int right, Operator op)
{

    int i = (int) op;

    switch(i)
    {
        case 0:
        {
            return left + right;
        }

        case 1:
        {
            return left - right;
        }

        case 2:
        { 
            return left * right;
        }

        case 3:
        {
            return left / right;
        }

        default:
        {
            return 0.0;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

最终结果应该是这样的:

Console.WriteLine("The sum of 5 and 5 is " + Calculate(5, 5, PLUS))
Output: The sum of 5 and 5 is 10
Run Code Online (Sandbox Code Playgroud)

你能告诉我我是怎么弄乱的吗?

J.S*_*rkl 101

你不需要转换它

switch(op)
{
     case Operator.PLUS:
     {
        // your code 
        // for plus operator
        break;
     }
     case Operator.MULTIPLY:
     {
        // your code 
        // for MULTIPLY operator
        break;
     }
     default: break;
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,使用括号

  • 如果您在单个案例中引入了一个新变量,那么您当然需要使用括号.在那时我的强迫症开始了,我需要通过添加括号来使所有情况看起来相同.(严肃地说,我在switch语句中使用括号,因为我将它们用于其他地方的块.) (25认同)
  • 没有必要,但使代码更具可读性 (11认同)
  • 是的,但是如果你在任何地方使用它们 - 没有陷阱 - 一致的代码 - 提高了可读性 - 简单的维护/扩展 - 最好的做法(习惯了它们) (9认同)
  • @ J.Starkl嗯,这是一个意见问题,我认为:-) (8认同)
  • 为何在这里使用括号? (3认同)

Prz*_*ski 24

由于 C# 8.0 为枚举引入了一个新的 switch 表达式,你可以做得更优雅:

public double Calculate(int left, int right, Operator op) =>
            op switch 
        {
            Operator.PLUS => left + right,
            Operator.MINUS => left - right,
            Operator.MULTIPLY => left * right,
            Operator.DIVIDE => left / right,
            _    =>  0
        }
Run Code Online (Sandbox Code Playgroud)

参考 https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-8

  • 请将除后的值之一转换为双精度数,不要混淆新手并传播错误的代码。 (3认同)

Jus*_*rei 9

已经给出了正确的答案,不过这里有更好的方法(比开关):

private Dictionary<Operator, Func<int, int, double>> operators =
    new Dictionary<Operator, Func<int, int, double>>
    {
        { Operator.PLUS, ( a, b ) => a + b },
        { Operator.MINUS, ( a, b ) => a - b },
        { Operator.MULTIPLY, ( a, b ) => a * b },
        { Operator.DIVIDE ( a, b ) => (double)a / b },
    };

public double Calculate( int left, int right, Operator op )
{
    return operators.ContainsKey( op ) ? operators[ op ]( left, right ) : 0.0;
}
Run Code Online (Sandbox Code Playgroud)

  • 我认为这是一个使用 var 来声明变量是合适的例子! (3认同)
  • 1.配置和逻辑的分离:您的代码变得简短易读.您的配置读起来就像一张桌子,也很简单.2.与switch不同,Dictionary在内部使用哈希表进行快速查找,在有很多情况下会变得很重要.有时程序员将最常用的项目放在交换机的末尾,并且性能有问题.3.从代码中提取配置后,现在可以创建很多很棒的东西: (2认同)
  • 我想看到一个可靠的证据,证明字典查找比“使用枚举切换”更快。 (2认同)