C#如何使用开关的枚举

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

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

最终的结果应该是这样的:

 Console.WriteLine("The sum of 5 and 5 is " + Calculate(5, 5, PLUS)) Output: The sum of 5 and 5 is 10 

你能告诉我我是怎么搞的吗?

你不需要转换它

 switch(op) { case Operator.PLUS: { } } 

顺便说一下,使用括号

根本不要投到int

  switch(operator) { case Operator.Plus: //todo 

你不应该转换为整数。 而对于这个分区,你需要先把左边的数字加倍,如果不是,你将会进行一个整数除法。

 public enum Operator { PLUS, MINUS, MULTIPLY, DIVIDE } public double Calculate(int left, int right, Operator op) { double sum = 0.0; switch(op) { case Operator.PLUS: sum = left + right; return sum; case Operator.MINUS: sum = left - right; return sum; case Operator.MULTIPLY: sum = left * right; return sum; case Operator.DIVIDE: sum = (double)left / right; return sum; default: return sum; } return sum; } 

已经给出了正确的答案,但是这里是比开关更好的方法:

 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; } 
  public enum Operator { PLUS, MINUS, MULTIPLY, DIVIDE } public class Calc { public void Calculate(int left, int right, Operator op) { switch (op) { case Operator.DIVIDE: //Divide break; case Operator.MINUS: //Minus break; case Operator.MULTIPLY: //... break; case Operator.PLUS: //;; break; default: throw new InvalidOperationException("Couldn't process operation: " + op); } } } 

如果你不想为每个case使用return语句,试试这个:

 Calculate(int left, int right, Operator op) { int result = 0; switch(op) { case Operator.PLUS: { result = left + right;; } break; .... } return result; } 

所有其他的答案是正确的,但你也需要正确地调用你的方法:

 Calculate(5, 5, Operator.PLUS)) 

而且由于你使用int来表示leftright ,结果也是int3/2 will result in 1 )。 你可以在计算结果之前进行double ,或者修改参数来接受double

两件事情。 首先,您需要在testing中限定枚举引用,而不是“PLUS”,它应该是“Operator.PLUS”。 其次,如果在switch语句中使用枚举成员名称而不是整数值,则该代码将更具可读性。 我更新了你的代码:

 public enum Operator { PLUS, MINUS, MULTIPLY, DIVIDE } public static double Calculate(int left, int right, Operator op) { switch (op) { default: case Operator.PLUS: return left + right; case Operator.MINUS: return left - right; case Operator.MULTIPLY: return left * right; case Operator.DIVIDE: return left / right; } } 

调用这个:

 Console.WriteLine("The sum of 5 and 5 is " + Calculate(5, 5, Operator.PLUS)); 

你的代码很好。 如果您不确定如何使用计算function,请尝试

 Calculate(5,5,(Operator)0); //this will add 5,5 Calculate(5,5,Operator.PLUS);// alternate 

默认枚举值从0开始,对于后面的元素加1,直到分配不同的值。 你也可以做:

 public enum Operator{PLUS=21,MINUS=345,MULTIPLY=98,DIVIDE=100}; 

无需转换。 你可以在交换机的Enums上应用条件。 像这样,

 public enum Operator { PLUS, MINUS, MULTIPLY, DIVIDE } public double Calculate(int left, int right, Operator op) { switch (op) { case Operator.PLUS: return left + right; case Operator.MINUS: return left - right; case Operator.MULTIPLY: return left * right; case Operator.DIVIDE: return left / right; default: return 0.0; } } 

然后,像这样调用它:

 Console.WriteLine("The sum of 5 and 5 is " + Calculate(5, 5, Operator.PLUS));