列挙型と組み合わせてスイッチを使用する方法がわかりません。私が間違っていることと、その修正方法を教えてください。基本的な計算機を作成するには、列挙型を使用する必要があります。
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:
{
// your code
// for plus operator
break;
}
case Operator.MULTIPLY:
{
// your code
// for MULTIPLY operator
break;
}
default: break;
}
ところで、ブラケットを使用
正しい答えはすでに与えられていますが、それでも良い方法があります(スイッチよりも):
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;
}
単純に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;
}
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);
}
}
}
他のすべての答えは正しいですが、メソッドを正しく呼び出す必要もあります。
Calculate(5, 5, Operator.PLUS))
また、int
とleft
にright
を使用するため、結果もint
になります(3/2 will result in 1
)。結果を計算する前にdouble
にキャストするか、double
を受け入れるようにパラメーターを変更できます
各ケースでreturnステートメントを使用したくない場合は、これを試してください:
Calculate(int left, int right, Operator op)
{
int result = 0;
switch(op)
{
case Operator.PLUS:
{
result = left + right;;
}
break;
....
}
return result;
}
2つのこと。まず、テストで列挙参照を修飾する必要があります-「PLUS」ではなく、「Operator.PLUS」である必要があります。次に、switchステートメントで整数値ではなくenumメンバー名を使用した場合、このコードははるかに読みやすくなります。コードを更新しました:
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));
コードは問題ありません。 Calculate関数の使用方法がわからない場合は、試してください
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};
変換する必要はありません。スイッチ内の列挙に条件を適用できます。そのようです、
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));