Question

Dans l'extrait de code C # suivant
J'ai une boucle ' while ' dans une boucle ' foreach ' et je souhaite passer à l'élément suivant dans ' foreach ' lorsqu'un certain la condition se produit.

foreach (string objectName in this.ObjectNames)
{
    // Line to jump to when this.MoveToNextObject is true.
    this.ExecuteSomeCode();
    while (this.boolValue)
    {
        // 'continue' would jump to here.
        this.ExecuteSomeMoreCode();
        if (this.MoveToNextObject())
        {
            // What should go here to jump to next object.
        }
        this.ExecuteEvenMoreCode();
        this.boolValue = this.ResumeWhileLoop();
    }
    this.ExecuteSomeOtherCode();
}

' continue ' sauterait au début de la boucle ' alors que ' ne serait pas la boucle ' foreach '. Y a-t-il un mot-clé à utiliser ici ou devrais-je simplement utiliser goto, ce que je n'aime pas vraiment.

Était-ce utile?

La solution

Ce qui suit devrait faire l'affaire

foreach (string objectName in this.ObjectNames)
{
    // Line to jump to when this.MoveToNextObject is true.
    this.ExecuteSomeCode();
    while (this.boolValue)
    {
        if (this.MoveToNextObject())
        {
            // What should go here to jump to next object.
            break;
        }
    }
    if (! this.boolValue) continue; // continue foreach

    this.ExecuteSomeOtherCode();
}

Autres conseils

Utilisez le mot-clé break. Cela va quitter la boucle while et continuer l'exécution en dehors de celle-ci. Etant donné que vous n'avez plus rien après la fin de la lecture, il passera en boucle au prochain élément de la boucle foreach.

En fait, si vous examinez votre exemple de plus près, vous souhaitez réellement pouvoir avancer dans la boucle sans quitter le moment. Vous ne pouvez pas faire cela avec une boucle foreach, mais vous pouvez décomposer une boucle foreach en fonction de ce qu'elle automatise en réalité. Dans .NET, une boucle foreach est en fait rendue sous la forme d'un appel .GetEnumerator () sur l'objet IEnumerable (votre objet this.ObjectNames est).

La boucle foreach est fondamentalement la suivante:

IEnumerator enumerator = this.ObjectNames.GetEnumerator();

while (enumerator.MoveNext())
{
    string objectName = (string)enumerator.Value;

    // your code inside the foreach loop would be here
}

Une fois que vous avez cette structure, vous pouvez appeler enumerator.MoveNext () dans votre boucle while pour passer à l’élément suivant. Donc, votre code deviendrait:

IEnumerator enumerator = this.ObjectNames.GetEnumerator();

while (enumerator.MoveNext())
{
    while (this.ResumeWhileLoop())
    {
        if (this.MoveToNextObject())
        {
            // advance the loop
            if (!enumerator.MoveNext())
                // if false, there are no more items, so exit
                return;
        }

        // do your stuff
    }
}

Le mot clé break; permet de sortir d'une boucle:

foreach (string objectName in this.ObjectNames)
{
    // Line to jump to when this.MoveToNextObject is true.
    while (this.boolValue)
    {
        // 'continue' would jump to here.
        if (this.MoveToNextObject())
        {
            break;
        }
        this.boolValue = this.ResumeWhileLoop();
    }
}

Utilisez goto .

(Je suppose que les gens vont être fous de cette réponse, mais je pense vraiment que c'est plus lisible que toutes les autres options.)

Vous pouvez utiliser "break; " quitter le plus profond ou tout au plus.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top