15 votes

Comment implémenter for-else et foreach-else en C# de manière similaire aux for-else et while-else de Python ?

Les boucles for et while de Python incluent une clause else facultative qui s'exécute si la boucle se termine normalement (c'est-à-dire sans une instruction break). Par exemple, en Python, vous pourriez écrire :

for x in range(3):
    print(x)
else
    print("La boucle s'est terminée normalement")

Et le résultat sera :

0
1
2
La boucle s'est terminée normalement

Comment pourriez-vous accomplir quelque chose de similaire en C# pour coder quelque chose comme ce qui suit :

for (int i = 0; i < 3; i++)
{
    Console.WriteLine(x);                  
}
else
    Console.WriteLine("La boucle s'est terminée normalement");

22voto

Jon Egerton Points 16192

La construction Python pour foreach-else est comme ceci :

foreach( elem in collection )
{
    if( condition(elem) )
        break;
}
else
{
    doSomething();
} 

Le bloc else s'exécute uniquement si break n'est pas appelé pendant la boucle foreach

L'équivalent en C# pourrait être :

bool found = false;
foreach( elem in collection )
{
    if( condition(elem) )
    {
        found = true;
        break;
    }
}
if( !found )
{
    doSomething();
}

Source : The Visual C# Developer Center

6voto

C.Evenhuis Points 10818

Bien sûr :

  • Utilisez l'une des suggestions originales des autres contributeurs

  • Utilisez une méthode qui effectue la boucle, au lieu de break, vous pouvez return pour éviter d'exécuter du code en dessous de la boucle

  • Utilisez une variable booléenne que vous pouvez définir avant de break, et testez cela après la boucle

  • Utilisez goto à la place de break

C'est un motif étrange à mon avis. "Foreach" est toujours commencé donc le mot "else" n'a pas de sens là.

4voto

BoltClock Points 249668

Si vous faites référence aux constructions for-else et while-else en Python, il existe une méthode d'extension de base IEnumerable qui simule un foreach-else décrit dans cet article, avec l'implémentation suivante:

public static void ForEachElse(
    this IEnumerable source,
    Func action, Action @else)
{
    foreach (var i in source)
    {
        if (!action(i))
        {
            return;
        }
    }
    @else();
}

4voto

mehmetseckin Points 2811

En le googlant, j'ai trouvé ceci : http://www-jo.se/f.pfleger/.net-for-else

public static void ForEachElse(
this IEnumerable source,
Func,
bool action,
Action @else
)  // fin des paramètres
{
foreach (var i in source)
  {
    if (!action(i))
      {
        return;
      }
  }
   @else();
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X