Continuar en bucles while anidados

Continuar en bucles while anidados

ACTUALIZACIÓN:Esta pregunta fue inspiración para mi artículo sobre este tema. ¡Gracias por la excelente pregunta!

"continue" y "break" no son más que una agradable sintaxis para "goto". Aparentemente, al darles nombres lindos y restringir sus usos a estructuras de control particulares, ya no provocan la ira de la multitud de "todos los gotos son malos todo el tiempo".

Si lo que quiere hacer es continuar hacia el exterior, podría simplemente defina una etiqueta en la parte superior del bucle externo y luego "ir a" esa etiqueta. Si sintió que hacerlo no impidió la comprensión del código, entonces esa podría ser la solución más conveniente.

Sin embargo, tomaría esto como una oportunidad para considerar si su flujo de control se beneficiaría de alguna refactorización. Cada vez que tengo condicional "romper" y "continuar" en bucles anidados, considero la refactorización.

Considere:

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

Dos técnicas de refactorización:

Primero, extraiga el ciclo interno a un método:

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

En segundo lugar, ¿pueden todos los bucles ser eliminado? Si está haciendo un bucle porque está tratando de buscar algo, refactorícelo en una consulta.

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
}

¡Si no hay bucles, entonces no hay necesidad de interrumpir o continuar!


    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 ; 
    }

Problema resuelto. (¿¿Qué? ¿Por qué me están dando esa mirada sucia?)


Puedes usar un descanso; declaración.

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

Continuar se usa para volver a la parte superior del bucle actual.

Si necesita dividir más niveles, tendrá que agregar algún tipo de 'si' o usar el temido/no recomendado 'ir a'.