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
来表示left
和right
,结果也是int
( 3/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));