Comment sortir d'une boucle foreach à l'intérieur d'un bloc switch ?
Normalement, vous utilisez break mais si vous utilisez un break à l'intérieur d'un bloc switch, cela vous fera juste sortir d'un bloc switch et la boucle foreach continuera son exécution :
foreach (var v in myCollection)
{
switch (v.id)
{
case 1:
if (true)
{
break;
}
break;
case 2;
break
}
}
Ce que je fais actuellement quand j'ai besoin de sortir de la foreach
alors qu'au sein de la switch
fixe un bool
placée à l'extérieur de la boucle à true et en vérifiant la valeur de ce bool à chaque fois que la fonction foreach
et avant d'entrer dans le bloc de commutation. Quelque chose comme ça :
bool exitLoop;
foreach (var v in myCollection)
{
if (exitLoop) break;
switch (v.id)
{
case 1:
if (true)
{
exitLoop = true;
break;
}
break;
case 2;
break
}
}
Cela fonctionne mais je continue à penser qu'il doit y avoir une meilleure façon de faire que je ne connais pas...
EDIT : Je me demande pourquoi cela n'a pas été implémenté dans .NET de la manière très soignée dont cela fonctionne dans PHP comme mentionné par @jon_darkstar ?
$i = 0;
while (++$i) {
switch ($i) {
case 5:
echo "At 5<br />\n";
break 1; /* Exit only the switch. */
case 10:
echo "At 10; quitting<br />\n";
break 2; /* Exit the switch and the while. */
default:
break;
}
}
0 votes
Je ne sais pas s'il existe une meilleure solution, mais ce serait comme si on devait sortir d'une boucle extérieure tout en restant dans la boucle intérieure. Jusqu'à présent, je n'ai pas trouvé de moyen de le faire et donc l'utilisation d'une valeur de drapeau semble être la seule solution.
0 votes
Duplicata possible de Sortez d'une boucle while qui contient une instruction switch.
0 votes
Plus de 15 ans d'expérience me disent que parfois goto est la meilleure option, rapide et optimisée, garder l'algorithme dans un petit endroit : le garder rapide, efficace, atomique, sans le détruire en mille morceaux, réduire les appels inutiles. Exemples, analyse des ondes acoustiques, vision artificielle, temps réel, etc. Un drapeau ne le rendra pas plus lent, je le vois comme impossible, mais beaucoup de drapeaux peuvent être un problème de lecture.