Не может разорвать цикл foreach - PullRequest
0 голосов
/ 28 сентября 2019

Я использую коллекцию для добавления списка сотрудников с функцией добавления и отображения, как показано ниже:

class Collection<T>
{
    static List<T> list = new List<T>();
    public Collection()
    {

    }

    public bool Add(T obj, ref T u)
    {
        list.Add(obj);  
        return true;
    }

    public void Display()
    {
        bool s = false;
        foreach (T u in list)
        {
            Console.WriteLine(u.ToString());
            s = true;
            break;
        }         
    }

И класс, содержащий меню:

public class EmployeeManagement : Employee
{
    Collection<Employee> emp = new Collection<Employee>();
    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: ");
        int choice = Convert.ToInt32(Console.ReadLine());
        do
        {
            switch(choice)
            {
            case 1:
                ImportEmployee();
                break;
            case 2:
                emp.Display();
                break;
            }
        } while (true);


    }

    public void AddEmployee(Employee u)
    {
        u.InputEmployee();           
        if (!emp.Add(u))
        {
            Console.WriteLine("88");
        }
    }


    public void ImportEmployee()
    {

        while (true)
        {

            Console.WriteLine("================== Import Employee ============");
            Console.WriteLine("1. Salaried Employee");
            Console.WriteLine("2. Hourly Employee");
            Console.WriteLine("3. Main Menu");
            int choice = Convert.ToInt32(Console.ReadLine());
            if (choice == 1)
            {
                SalariedEmployee salEmployee = new SalariedEmployee();
                AddEmployee(salEmployee);
            }
            else if (choice == 2)
            {
                HourlyEmployee hourlyEmployee = new HourlyEmployee();
                AddEmployee(hourlyEmployee);
            }
            else
            {
                MainMenu();
                break;
            }
            Console.ReadKey();
        }

    }
}

У меня естьдобавлен новый сотрудник, и он был добавлен в мой список.После этого я нажал опцию 3, чтобы вернуться в главное меню и выбрать отображение сотрудника, он продолжал печатать мой список сотрудников и не мог разорвать цикл.Как я могу решить эту проблему, я пытался отобразить в меню importemployee (), и это работало без проблем.

1 Ответ

0 голосов
/ 28 сентября 2019

Разрыв в цикле 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

...