Выход из SUB-LOOPS с goto - PullRequest
       3

Выход из SUB-LOOPS с goto

0 голосов
/ 04 мая 2020

У меня есть три вложенных цикла. Я хочу вырваться из последних двух вложенных циклов (не всех трех вложенных циклов), как только условие будет выполнено в самом внутреннем l oop, а затем перейти к следующему элементу в родительском l oop.

Я не хочу возвращать или устанавливать логическую проверку. Я только хочу увидеть, будет ли этот подход работать. У меня большие данные, для подтверждения потребуется некоторое время.

while (all_Courses.Count != 0)
{
     string drawnCourse = all_Courses[0];
     foreach (Department department in departments)
     {
         if (department.Courses.Contains(drawnCourse))
         {
             foreach (DayOfWeek day in daySlot)
             {
                 if (!department.Courses.Intersect(day.Day).Any())
                 {
                     day.Day[i] = drawnCourse;
                     all_Courses.Remove(drawnCourse);
                     goto NextCourse;
                 }
             }
        }
   }
   NextCourse:
   continue; //start the iteration again at the parent loop

}

Ответы [ 2 ]

1 голос
/ 04 мая 2020

Вероятно, вам будет легче с вещами, если вы используете Linq

с помощью System.Linq;

Затем, в вашем l oop по отделу, примените in-line в предложении where, поэтому он получает только один

foreach (Department department in 
            departments.Where( d => d.Courses.Contains( drawnCourse)).FirstOrDefault()
            {
               // now you will only get here for the first department that matches
               // and will exit out after that.  If no day match, it wont even try 
               // another department.

            }

. Часть (d =>….) подразумевается как

, пока я нахожусь в скобках предложения WHERE, есть переменная " d "представляет любой текущий отдел в списке. Теперь я могу сравнить это, и как только я доберусь до ПЕРВОЙ (или по умолчанию) записи, разрешите продолжить.

Должен быть только один отдел, с которым курс, вероятно, будет связан и выйдет сразу после это и даже не пытаться второй отдел.

Что касается вашего внешнего l oop из "allCourses", вам, вероятно, нужно пройти через индекс, начиная с позиции 0. Если вы удалите курсы из список, очевидно, будет сокращен. Но теперь, если вы удалите курс, на котором вы находитесь, вы не хотите увеличивать количество, потому что ваша новая запись «X» теперь соответствует тому, что было в индексе X + 1. Внимательно относитесь к тому, как, по вашему мнению, вы их обрабатываете.

0 голосов
/ 04 мая 2020

Goto не очень хороший вариант. Для множественного внутреннего l oop перерыва вы должны установить условие выхода / перерыва из l oop.

        while (all_Courses.Count != 0)
        {
            string drawnCourse = all_Courses[0];
            foreach (Department department in departments)
            {
                foreach (DayOfWeek day in daySlot)
                {
                    if (condition)
                    {
                        all_Courses.Remove(drawnCourse);
                        break;
                    }
                }
                if (!all_Courses.Contains(drawnCourse))
                {
                    break;
                }
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...