MISE À JOUR: Cette question a été une source d'inspiration pour my article on this subject. Merci pour la bonne question! "Continuer" et "break" ne sont rien de plus qu'une syntaxe agréable pour un "goto". Apparemment, en leur donnant des noms mignons et en limitant leurs usages à des structures de contrôle particulières, ils ne sont plus attirés par la colère de la foule «tous les gotos sont tous mauvais tout le temps». Si vous voulez faire un continu à externe, vous pouvez simplement définir une étiquette en haut de la boucle externe et ensuite "goto" cette étiquette. Si vous pensiez que cela ne gênait pas la compréhension du code, alors cela pourrait être la solution la plus opportune.
Cependant, je considérerais ceci comme une opportunité de considérer si votre flux de contrôle bénéficierait d'un refactoring. Chaque fois que j'ai "break" conditionnel et "continuer" dans les boucles imbriquées, je considère refactoring.
Tenir compte:
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
Deux techniques de refactorisation:
D'abord, extraire la boucle interne à une méthode:
foreach(var candidate in candidates)
{
if (MeetsCriteria(candidate, criteria))
{
successfulCandidate = candidate;
break;
}
}
En second lieu, peuvent toutes les boucles éliminés? Si vous faites une boucle parce que vous essayez de chercher quelque chose, refactornez-le en une requête.
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
}
S'il n'y a pas de boucle, il n'est pas nécessaire de rompre ou de continuer!
Les boucles imbriquées ne mènent qu'au désespoir. –