Вложенный оператор switch не обращается к внутренним случаям switch c # - PullRequest
0 голосов
/ 11 октября 2018

Я использую вложенные операторы switch в моей программе.По какой-то причине внутренние операторы switch не работают.

Ожидаемое поведение: при запуске программы пользователю предоставляется 5 опций;A: SUBJECTS, B: STUDENTS, C: ENROLMENT, D: GRADES_RECORD E: EXIT.Из этих опций A, B, C и D содержат дополнительные операторы переключения.Возьмем для примера case A: SUBJECTS.После того, как случай A был выбран, пользователю предоставляется еще 3 варианта;A: ADD_SUBJECTS, B: EDIT_SUBJECTS and C: DELETE_SUBJECTS.Затем пользователь выбирает один из этих параметров, после чего выполняется некоторый код.Допустим, например, что пользователь выбирает A, он будет проходить процедуру добавления темы в пул субъектов.

Фактическое поведение: при запуске программы отображается начальное приглашение A: SUBJECTS, B: STUDENTS, C: ENROLMENT, D: GRADES_RECORD E: EXIT, запрашивающее пользователявыбрать дело.Как только пользователь выбирает регистр, ему выводится второе приглашение, которое относится к выбранной опции.Например, если пользователь выбрал A в первом приглашении, отображается второе приглашение A: ADD_SUBJECTS, B: EDIT_SUBJECTS and C: DELETE_SUBJECTS.Отлично, вот как я хочу, чтобы это работало.Но вот проблема.Когда пользователь теперь выбирает параметр, независимо от того, какой параметр был выбран, программа действует так, как будто выбран случай ADD_SUBJECT, и проходит через код для этого.Это для родительского случая A: SUBJECTS.Что касается остальных родительских наблюдений, отображается соответствующее дочернее приглашение, но любой ввод / выбор дочернего запроса приводит к отображению начального приглашения A: SUBJECTS, B: STUDENTS, C: ENROLMENT, D: GRADES_RECORD E: EXIT, к которому он вообще не обращается ни к одному из внутренних наблюдений.

См. Код ниже:

   static void Main(string[] args)
        {
            Console.Title = "Students Record";
            LoadJson();
            Run();
        }

    static void Run()
    {
        while (true)
        {
            var consoleInput = ReadFromConsole(MainPrompt);
            if (string.IsNullOrWhiteSpace(consoleInput)) continue;

            Execute(consoleInput);
        }
    }

    public static string ReadFromConsole(string prompt)
    {
        Console.Write(prompt);
        return Console.ReadLine();
    }


static void Execute(string userChoice)
{        
switch(userChoice.ToUpper())
{
case A:
{
          ReadFromConsole(SubjectPrompt);

           switch (userChoice.ToUpper())
           {
              case "A"/*ADD_SUBJECT*/:
              {
                AddSubject();
                break;      
              }

               case "B"/*EDIT_SUBJECT*/:
               {
                  Console.WriteLine("edit subject");
                  break;
               }

               case "C"/*DELETE_SUBJECT*/:
               {
                   Console.WriteLine("delete subject");
                   break;
               }
         }
         break;
 }
case B:/*{some code}*/
case C:/*{some code}*/
case D:/*{some code}*/
case E:/*{some code}*/
}
}

Случаи B, C и D имеют одинаковый формат.

Кто-нибудь может понять, почему для родительского случая A он всегда предлагает добавить тему независимо от того, какой случай выбран, а для остальных родительских случаев он просто отображает исходное приглашение?

Спасибозаранее

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Переменная userChoice по-прежнему равна "A" во втором операторе switch, просто удалите ее значение или создайте новую переменную и передайте это новое значение второму переключателю:

...
var newInput = ReadFromConsole(SubjectPrompt);
switch (newInput.ToUpper())
{
  ...
}
0 голосов
/ 11 октября 2018

Метод ReadFromConsole возвращает string, но вы не присваиваете его userChoice, который поддерживает значение, которое он имеет при вводе метода.

case "A":
{
    userChoice = ReadFromConsole("Subject");

    switch (userChoice.ToUpper())
        case "A"/*ADD_SUBJECT*/:
        {
            AddSubject();
            break;
        }

        case "B"/*EDIT_SUBJECT*/:
        {
            Console.WriteLine("edit subject");
            break;
        }

        case "C"/*DELETE_SUBJECT*/:
        {
            Console.WriteLine("delete subject");
            break;
        }
    }
    break;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...