С# как использовать перечисление с переключателем
Я не могу понять, как использовать коммутаторы в сочетании с перечислением. Не могли бы вы рассказать мне, что я делаю неправильно, и как это исправить? Я должен использовать перечисление для создания базового калькулятора.
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
Не могли бы вы, ребята, рассказать мне, как я возился?
Ответы
Ответ 1
Вам не нужно конвертировать его
switch(op)
{
case Operator.PLUS:
{
// your code
// for plus operator
break;
}
case Operator.MULTIPLY:
{
// your code
// for MULTIPLY operator
break;
}
default: break;
}
Кстати, используйте скобки
Ответ 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;
}
Ответ 3
просто не бросать в int
switch(operator)
{
case Operator.Plus:
//todo
Ответ 4
Вы не должны бросать в целое число. А для разделения вам нужно сначала бросить левый, чтобы удвоить, если не будете делать целочисленное разделение.
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;
}
Ответ 5
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);
}
}
}
Ответ 6
Поскольку в С# 8.0 введено новое выражение-переключатель для перечислений, вы можете сделать это еще более элегантно:
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
}
Ref. https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-8
Ответ 7
Все остальные ответы верны, но вам также необходимо правильно позвонить по своему методу:
Calculate(5, 5, Operator.PLUS))
И поскольку вы используете int
для left
и right
, результат будет также int
(3/2 will result in 1
). вы можете использовать double
перед вычислением результата или изменить свои параметры, чтобы принять double
Ответ 8
Если вы не хотите использовать оператор возврата для каждого случая, попробуйте следующее:
Calculate(int left, int right, Operator op)
{
int result = 0;
switch(op)
{
case Operator.PLUS:
{
result = left + right;;
}
break;
....
}
return result;
}
Ответ 9
Две вещи. Во-первых, вам нужно квалифицировать ссылку перечисления в своем тесте, а не "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));
Ответ 10
Ваш код в порядке. Если вы не знаете, как использовать функцию Calculate, попробуйте
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};
Ответ 11
Не нужно конвертировать. Вы можете применять условия для 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));