Разрыв в цикле foreach в Display () в порядке.« break; » прерывает ближайший цикл или оператор switch.
Ваша проблема в том, что вы не можете выйти из do-while в MainMenu () и что ваш выборостанется 2, потому что вы не читаете ввод в do-while.
Другими словами, вы выйдете из foreach в Display (), вы окажетесь в переключателе в MainMenu (), вы выйдете из переключателя, вы начнете делать- еще раз, а затем вы войдете в Display (), потому что ваш выбор все равно будет 2. Это будет повторяться.
Я написал несколько комментариев для вашего кода, чтобы вы могли следить за процессомнемного проще и добавил несколько предложений.
public void Display()
{
bool s = false;
foreach (T u in list)
{
Console.WriteLine(u.ToString());
s = true;
//Breaks out of this loop, nothing wrong here. I would use return though, if I don't have to perform any code afterwards.
break;
}
}
public void MainMenu()
{
.
.
.
//Only reading choice once. Would need to handle exception
int choice = Convert.ToInt32(Console.ReadLine());
do
{
//Choice will always be what you initially selected since you are not reading it inside the do-while. If you selected two it will always be two.
switch(choice)
{
case 1:
ImportEmployee();
//Breaks out of switch statement
break;
case 2:
emp.Display();
//Breaks out of switch statement
break;
}
//Infinity loop since you have no breaks for the do-while or a condition to exit it
} while (true);
}
Мое предложение для вашего do-while, если вы хотите использовать do-while, было бы иметь его следующим образом.
public void MainMenu()
{
Console.WriteLine("1. Import Employee");
Console.WriteLine("2. Display Employee Information");
Console.WriteLine("3. Search Employee");
Console.WriteLine("4. Exit");
Console.WriteLine("Enter Menu Option Number: ");
//Default value 0
int choice;
do
{
//Use TryParse, it safely tries to interpret a string as a number. For string "s" it would return false, for string -1 it would return -1.
//If an invalid string is entered, it will display a message, set choice to 0, go to the end of the loop then start over reading a key.
//The entered string needs to be between the value of 1 and 4
if (!int.TryParse(Console.ReadLine(), out choice) || choice > 4 || choice < 1)
{
//We do not want to automatically trigger our switch with our previous value
choice = 0;
Console.WriteLine("Invalid menu selection, select 1-4");
}
switch (choice)
{
case 1:
ImportEmployee();
break;
case 2:
emp.Display();
break;
case 3:
Console.WriteLine("Not implemented");
break;
}
} while (choice != 4); //Only stop the loop if we selected 4
}
Есть много разных способов сделать это, но это похоже на школьное задание, поэтому я просто отвечаю на ваш вопрос и не предлагаю других улучшений.
У вас также есть довольно большая проблема в "ImportEmployee ()", которая станет очевидной, когда вы исправите цикл главного меню.Если вам понадобится подсказка позже, я буду публиковать комментарии, но постараюсь найти ее самостоятельно.
GL