2013-02-28 84 views
39

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

难道你们,请告诉我,我怎么搞乱?

回答

71

你并不需要把它

switch(op) 
{ 
    case Operator.PLUS: 
    { 

    } 
} 

转换顺便说一句,用括号

+2

为什么这里使用括号? – 2013-02-28 13:01:17

+8

没有必要,但使代码更具可读性 – 2013-02-28 13:02:14

+0

谢谢,这工作。我还会添加括号。 – ohyeah 2013-02-28 13:06:16

2

你不应该强制转换为整数。而对于这个分区,你需要先左移两倍,否则你将会进行整数分割。

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

根本不强制转换为int

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

所有其他的答案是正确的,但你还需要打电话给你的方法正确:

Calculate(5, 5, Operator.PLUS)) 

而且,由于您使用int对于leftright,结果也将是int3/2 will result in 1)。你可以转换为double计算结果之前或修改电脑参数来接受double

+0

这是一个发现错误的问题... – 2013-02-28 13:02:54

+0

嗯..是的,种类... :-D – 2013-02-28 13:05:56

1
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); 
      } 
     } 
    } 
0

两件事情。首先,您需要在测试中限定枚举引用 - 而不是“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)); 
2

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

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

我认为这是一个使用var声明变量的适当的例子! – 2013-02-28 16:09:19

+0

Var不能在方法体外使用。 – JustAndrei 2013-02-28 20:33:20

+0

噢,是的,我错过了它被宣布在方法之外。 – 2013-02-28 23:46:36

0

你的代码很好。如果你不知道如何使用计算功能,尝试

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

默认枚举值从0开始并增加一个用于以下元素,直到您分配不同的值。你也可以这样做:

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

如果你不想使用return语句对于每一种情况下,试试这个:

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

    return result; 
} 
0

无需转换。您可以在交换机中的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));