如何在Switch语句中使用C#enum,同时保持其余代码不变

如何在Switch语句中使用C#enum,同时保持其余代码不变,c#,math,enums,console,C#,Math,Enums,Console,我正在做一个C#数学项目,用户根据他们选择的难度回答一个加法、减法、乘法、除法、幂或平方根问题 我刚刚开始使用enum,但我不知道如何将它放在switch语句中,以便我的其余代码可以正常工作 以下是我目前的代码: using System; namespace mathstester { class Program { public enum UserDifficulty { Easy, Norma

我正在做一个C#数学项目,用户根据他们选择的难度回答一个加法、减法、乘法、除法、幂或平方根问题

我刚刚开始使用enum,但我不知道如何将它放在switch语句中,以便我的其余代码可以正常工作

以下是我目前的代码:

using System;

namespace mathstester
{
    class Program
    {
        public enum UserDifficulty
        {
            Easy,
            Normal,
            Hard
        }

        public enum MathOperation
        {
            Addition = 1,
            Subtraction = 2,
            Multiplication = 3,
            Division = 4,
            Power = 5,
            SquareRoot = 6
        }
        public static (int operationMin, int operationMax) GetMathOperationForDifferentDifficulties(UserDifficulty userDifficulty)
        {

            switch (userDifficulty)
            {
                case UserDifficulty.Easy:
                    return (1, 4);
                case UserDifficulty.Normal:
                    return (1, 5);
                case UserDifficulty.Hard:
                    return (3, 7);
                default:
                    throw new Exception();
            }
        }

        public static (string message, double correctAnswer) GetMathsEquation(MathOperation mathOperation, UserDifficulty userDifficulty)
        {
            int number1;
            int number2;
            Random random = new Random();

            switch (mathOperation)
            {
                case MathOperation.Addition:
                    number1 = random.Next(1000);
                    number2 = random.Next(1000);
                    return ($"{number1} + {number2}", number1 + number2);
                case MathOperation.Subtraction:
                    number1 = random.Next(1000);
                    number2 = random.Next(1000);
                    return ($"{number1} - {number2}", number1 - number2);
                case MathOperation.Multiplication:
                    number1 = userDifficulty == UserDifficulty.Easy ? random.Next(13) : random.Next(1000);
                    number2 = userDifficulty == UserDifficulty.Easy ? random.Next(13) : random.Next(1000);
                    return ($"{number1} * {number2}", number1 * number2);
                case MathOperation.Division:
                    number1 = random.Next(10000);
                    number2 = random.Next(1000);
                    return ($"{number1} / {number2}", number1 / (double)number2);
                case MathOperation.Power:
                    number1 = random.Next(13);
                    number2 = random.Next(5);
                    return ($"{number1} ^ {number2}", Math.Pow(number1, number2));
                case MathOperation.SquareRoot:
                    number1 = random.Next(1000);
                    return ($"√{number1}", Math.Sqrt(number1));
                default:
                    throw new Exception();
            }
        }

        public static int GetResult(int numberOfQuestionsLeft, string userDifficulty)
        {
            int score = 0;
            Random random = new Random();
            var (operationMin, operationMax) = GetMathOperationForDifferentDifficulties(userDifficulty);
            while (numberOfQuestionsLeft > 0)
            {
                int mathOperation = random.Next(operationMin, operationMax);
                var (message, correctAnswer) = GetMathsEquation(mathOperation, userDifficulty);
                if (mathOperation == 4 || mathOperation == 6)
                {
                    Console.Write($"To the nearest integer, What is {message} =");
                }
                else
                {
                    Console.Write($"What is {message} =");
                }
                double userAnswer = Convert.ToDouble(Console.ReadLine());
                if (Math.Round(correctAnswer) == userAnswer)
                {
                    Console.WriteLine("Well Done!");
                    score++;
                }
                else
                {
                    Console.WriteLine("Your answer is incorrect!");
                }
                numberOfQuestionsLeft--;
            }

            return score;
        }

        public static void Main(string[] args)
        {
            string userDifficulty = "";
            do
            {
                Console.WriteLine("What difficulty level would you like to do! Please type E for Easy, N for Normal and H for hard");
                userDifficulty = Console.ReadLine().ToUpper();
            } while (userDifficulty != "E" && userDifficulty != "N" && userDifficulty != "H");

            int numberOfQuestions = 0;
            do
            {
                Console.WriteLine("How many questions would you like to answer? Please type a number divisible by 10!");
                int.TryParse(Console.ReadLine(), out numberOfQuestions);
            } while (numberOfQuestions % 10 != 0);

            int score = GetResult(numberOfQuestions, userDifficulty);
            Console.WriteLine($"You got a score of {score} out of {numberOfQuestions}");
        }
    }
}

您的问题似乎在于困难的选择-在
Main()
方法中,您需要输入
E
N
H
作为困难度,然后将其传递到
GetResult()
并继续传递到
getMathOperationforDifferentDifferences()

但是,由于枚举是由C#中的数字类型支撑的,因此这将失败并引发异常

要解决此问题,您需要将
E
N
H
分别转换为
usercoudity.Easy
usercoudity.Normal
usercoudity.Hard
,然后将其传递给其他用户

下面是如何修改
Main()
来执行此操作:

public static void Main(string[] args)
{
    string difficultyInput = "";
    UserDifficulty userDifficulty = UserDifficulty.Easy // default to start
    do
    {
        Console.WriteLine("What difficulty level would you like to do! Please type E for Easy, N for Normal and H for hard");
        difficultyInput = Console.ReadLine().ToUpper();
    } while (difficultyInput != "E" && difficultyInput != "N" && difficultyInput != "H");

    switch(difficultyInput) {
        case "E": 
            userDifficulty = UserDifficulty.Easy; 
            break;
        case "N": 
            userDifficulty = UserDifficulty.Normal; 
            break;
        case "H": 
            userDifficulty = UserDifficulty.Hard; 
            break;
    }

    int numberOfQuestions = 0;
    do
    {
        Console.WriteLine("How many questions would you like to answer? Please type a number divisible by 10!");
        int.TryParse(Console.ReadLine(), out numberOfQuestions);
    } while (numberOfQuestions % 10 != 0);

    int score = GetResult(numberOfQuestions, userDifficulty);
    Console.WriteLine($"You got a score of {score} out of {numberOfQuestions}");
}

请记住,您需要更改
GetResult()
以接受
用户难度
输入,而不是
字符串

旁注:不要继续使用
new Random()
在类中保留它的单个静态实例。谢谢!!但是在你写的第二行中,
userdemobility userdemobility=userdemobility.Easy
有没有办法将
userdemobility
设置为
userdemobility.Empty
之类的?这将有助于使代码看起来更干净!如果要将其添加到枚举中,则可以。