93 votes

C# : comment utiliser un enum avec un switch

Je n'arrive pas à comprendre comment utiliser les commutateurs en combinaison avec un enum. Pourriez-vous me dire ce que je fais de travers et comment y remédier ? Je dois utiliser un enum pour créer une calculatrice de base.

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

Le résultat final devrait être quelque chose comme ceci :

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

Pourriez-vous me dire comment je me trompe ?

3voto

kentaguilar Points 31

Pas besoin de se convertir. Vous pouvez appliquer des conditions sur les Enums à l'intérieur d'un switch. Par exemple,

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

Ensuite, appelez-le comme ceci :

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

2voto

omer schleifer Points 1853
 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);
            }
        }
    }

1voto

Stephan Bauer Points 3827

Toutes les autres réponses sont correctes, mais vous devez également appeler votre méthode correctement :

Calculate(5, 5, Operator.PLUS))

Et puisque vous utilisez int para left y right le résultat sera int également ( 3/2 will result in 1 ). vous pourriez lancer vers double avant de calculer le résultat ou modifiez vos paramètres pour accepter double

1voto

Martin.kv Points 917

Si vous ne voulez pas utiliser l'instruction de retour pour chaque cas, essayez ceci :

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

   return result;
}

0voto

Mike Points 148

Deux choses. Premièrement, vous devez qualifier la référence de l'enum dans votre test - plutôt que "PLUS", ce devrait être "Operator.PLUS". Deuxièmement, ce code serait beaucoup plus lisible si vous utilisiez les noms des membres de l'enum plutôt que leurs valeurs intégrales dans l'instruction switch. J'ai mis à jour votre code :

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

Appelez-le avec :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X