Продолжите во вложенных циклах с условием продолжения

Я не знаком с твердостью, но я использовал другие:

Рекурсивный

Рекурсивный значение по умолчанию для слияний неускоренной перемотки вперед. Мы все знакомы с тем.

Разветвитель

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

ответвление разветвителя объединяет многосекционные головки в одной фиксации, пока это может сделать это чисто.

Для иллюстрации, предположите, что у Вас есть проект, который имеет ведущее устройство, и затем три ответвления для слияния в (назовите их a, b, и c).

серия А рекурсивных слияний была бы похожа на это (обратите внимание, что первое слияние было ускоренной перемоткой вперед, поскольку я не вызвал рекурсию):

series of recursive merges

Однако единственное слияние разветвителя было бы похоже на это:

commit ae632e99ba0ccd0e9e06d09e8647659220d043b9
Merge: f51262e... c9ce629... aa0f25d...

octopus merge

Наш

Наш ==, который я хочу вытянуть в другой голове, но выбрасывать все изменения, которые представляет голова.

Это сохраняет историю ответвления без любого из эффектов ответвления.

(Read: на Это даже не смотрят изменения между теми ответвлениями. Ответвления просто объединяются, и ничто не сделано в файлы. Если Вы хотите объединиться в другом ответвлении и каждый раз, когда существует вопрос "наша версия файла или их версия", можно использовать git merge -X ours)

Поддерево

, Поддерево полезно, когда Вы хотите объединиться в другом проекте в подкаталог Вашего текущего проекта. Полезный, когда у Вас есть библиотека, Вы не хотите включать как подмодуль.

53
задан SkunkSpinner 15 July 2009 в 08:20
поделиться

10 ответов

ОБНОВЛЕНИЕ: Этот вопрос послужил источником вдохновения для моей статьи на эту тему. Спасибо за отличный вопрос!


«continue» и «break» - не более чем приятный синтаксис для «goto». Очевидно, давая им милые имена и ограничивая их использование определенными управляющими структурами, они больше не вызывают гнев толпы «все gotos все время плохие».

Если вы хотите, чтобы они продолжали- external, вы можете просто определить метку в верхней части внешнего цикла, а затем «перейти» к этой метке. Если вы считаете, что это не препятствует пониманию кода, то это может быть наиболее целесообразным решением.

Однако, Я бы воспользовался этим как возможностью подумать, выиграет ли ваш поток управления от некоторого рефакторинга. Каждый раз, когда у меня есть условные «break» и «continue» во вложенных циклах, я рассматриваю возможность рефакторинга.

Рассмотрим:

successfulCandidate = null;
foreach(var candidate in candidates)
{
  foreach(var criterion in criteria)
  {
    if (!candidate.Meets(criterion)) // Edited.
    {  // TODO: no point in continuing checking criteria.
       // TODO: Somehow "continue" outer loop to check next candidate
    }
  }
  successfulCandidate = candidate;
  break;
}
if (successfulCandidate != null) // do something

Два метода рефакторинга:

Во-первых, извлечь внутренний цикл в метод:

foreach(var candidate in candidates)
{
  if (MeetsCriteria(candidate, criteria))
  { 
      successfulCandidate = candidate;
      break;
  }
}

Во-вторых, могут ли все циклы быть устранены? Если вы зацикливаетесь из-за того, что пытаетесь что-то найти, то преобразовайте это в запрос.

var results = from candidate in candidates 
              where criteria.All(criterion=>candidate.Meets(criterion))
              select candidate;
var successfulCandidate = results.FirstOrDefault();
if (successfulCandidate != null)
{
  do something with the candidate
}

Если нет циклов, то нет необходимости прерывать или продолжать!

можно все петли устранить? Если вы зацикливаетесь из-за того, что пытаетесь что-то найти, то преобразовайте это в запрос.

var results = from candidate in candidates 
              where criteria.All(criterion=>candidate.Meets(criterion))
              select candidate;
var successfulCandidate = results.FirstOrDefault();
if (successfulCandidate != null)
{
  do something with the candidate
}

Если нет циклов, то нет необходимости прерывать или продолжать!

можно все петли устранить? Если вы зацикливаетесь из-за того, что пытаетесь что-то найти, то преобразовайте это в запрос.

var results = from candidate in candidates 
              where criteria.All(criterion=>candidate.Meets(criterion))
              select candidate;
var successfulCandidate = results.FirstOrDefault();
if (successfulCandidate != null)
{
  do something with the candidate
}

Если нет циклов, то нет необходимости прерывать или продолжать!

99
ответ дан 7 November 2019 в 08:19
поделиться
    while
    {
       // outer loop

       while
       {
           // inner loop
           try
           {
               throw;
           }
           catch 
           {
               // how do I continue on the outer loop from here?
               goto REPEAT;
           }
       }
       // end of outer loop
REPEAT: 
       // some statement or ; 
    }

Проблема решена. (что ?? Почему вы все так на меня смотрите?)

31
ответ дан 7 November 2019 в 08:19
поделиться

You can use a break; statement.

while
{
   while
   {
       try
       {
           throw;
       }
       catch 
       {
           break;
       }
   }
}

Continue is used to jump back to the top of the current loop.

If you need to break out more levels than that you will either have to add some kind of 'if' or use the dreaded/not recommended 'goto'.

18
ответ дан 7 November 2019 в 08:19
поделиться

No.
I suggest, extracting the inner loop into a separate method.

while
{
   // outer loop
       try
       {
           myMethodWithWhileLoopThatThrowsException()
       }
       catch 
       {
           // how do I continue on the outer loop from here?
           continue;
       }
   }
}
4
ответ дан 7 November 2019 в 08:19
поделиться

You just want to break from the inner which would continue the outer.

while
{
   // outer loop

   while
   {
       // inner loop
       try
       {
           throw;
       }
       catch 
       {
           // how do I continue on the outer loop from here?
           break;
       }
   }
}
1
ответ дан 7 November 2019 в 08:19
поделиться

Use break in the inner loop.

3
ответ дан 7 November 2019 в 08:19
поделиться

Я думаю, что лучший способ добиться этого - использовать оператор break . Break завершает текущий цикл , а продолжает выполнение с того места, где оно заканчивается . В этом случае он завершит внутренний цикл , а вернется во внешний цикл while . Вот как будет выглядеть ваш код:

while
{
   // outer loop

   while
   {
       // inner loop
       try
       {
           throw;
       }
       catch 
       {
           // break jumps to outer loop, ends inner loop immediately.
           break; //THIS IS THE BREAK
       }
   }
}

Я считаю, что это то, чего вы хотели достичь, верно? Спасибо!

0
ответ дан 7 November 2019 в 08:19
поделиться

Swap the try/catch structure with the inner while loop:

while {
  try {
    while {
      throw;
    }
  }
  catch {
    continue;
  }
}
10
ответ дан 7 November 2019 в 08:19
поделиться

Используйте собственный тип исключения, например MyException. Затем:

while
{
   try {
   // outer loop
   while
   {
       // inner loop
       try
       {
           throw;
       }
       catch 
       {
           // how do I continue on the outer loop from here?
           throw MyException;
       }
   }
   } catch(MyException)
   { ; }
}

Это будет работать для продолжения и выхода из нескольких уровней вложенных операторов while. Извините за плохое форматирование;)

-2
ответ дан 7 November 2019 в 08:19
поделиться
using System;

namespace Examples
{

    public class Continue : Exception { }
    public class Break : Exception { }

    public class NestedLoop
    {
        static public void ContinueOnParentLoopLevel()
        {
            while(true)
            try {
               // outer loop

               while(true)
               {
                   // inner loop

                   try
                   {
                       throw new Exception("Bali mu mamata");
                   }
                   catch (Exception)
                   {
                       // how do I continue on the outer loop from here?

                       throw new Continue();
                   }
               }
            } catch (Continue) {
                   continue;
            }
        } 
    }

}

}
0
ответ дан 7 November 2019 в 08:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: