C# Language Résiliation anticipée


Exemple

Vous pouvez étendre les fonctionnalités des méthodes de yield existantes en transmettant une ou plusieurs valeurs ou éléments pouvant définir une condition de terminaison dans la fonction en appelant une yield break pour empêcher l'exécution de la boucle interne.

public static IEnumerable<int> CountUntilAny(int start, HashSet<int> earlyTerminationSet)
{
    int curr = start;

    while (true)
    {
        if (earlyTerminationSet.Contains(curr))
        {
            // we've hit one of the ending values
            yield break;
        }

        yield return curr;

        if (curr == Int32.MaxValue)
        {
            // don't overflow if we get all the way to the end; just stop
            yield break;
        }

        curr++;
    }
}

La méthode ci-dessus effectuerait une itération à partir d’une position de start donnée jusqu’à ce qu’une des valeurs earlyTerminationSet dans le earlyTerminationSet soit rencontrée.

// Iterate from a starting point until you encounter any elements defined as 
// terminating elements
var terminatingElements = new HashSet<int>{ 7, 9, 11 };
// This will iterate from 1 until one of the terminating elements is encountered (7)
foreach(var x in CountUntilAny(1,terminatingElements))
{
    // This will write out the results from 1 until 7 (which will trigger terminating)
    Console.WriteLine(x);
}

Sortie:

1
2
3
4
5
6

Démo en direct sur .NET Fiddle