我在程序中使用嵌套的switch语句。由于某种原因,内部switch语句似乎不起作用。
预期的行为:启动程序后,向用户显示5个选项; A: SUBJECTS, B: STUDENTS, C: ENROLMENT, D: GRADES_RECORD E: EXIT
。在这些选项中,A,B,C和D包含其他switch语句。让我们以案例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总是提示添加主题,而不管选择了哪种案例,而对于其余父案例,它仅显示初始提示?
预先感谢
答案 0 :(得分:3)
方法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;
}
答案 1 :(得分:1)
在第二个switch语句中,变量 userChoice 仍等于“ A” ,只需擦除其值或创建一个新变量并将该新值传递给第二个切换:
...
var newInput = ReadFromConsole(SubjectPrompt);
switch (newInput.ToUpper())
{
...
}