2009-03-07 27 views
1

Dans le code C# suivant snippet
J'ai une boucle « while » dans une boucle « foreach » et je veux passer à l'élément suivant « foreach » lorsqu'une certaine condition se produit.Continuer pendant que l'intérieur foreach

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 » sauteraient au début de la boucle « while » et non la boucle « foreach ». Y a-t-il un mot-clé à utiliser ici, ou dois-je simplement utiliser goto que je n'aime pas vraiment?

Répondre

2

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(); 
} 
8

Utilisez le mot-clé break. Cela quittera la boucle while et continuera l'exécution en dehors de celle-ci. Puisque vous n'avez rien après, vous pouvez passer à l'élément suivant dans la boucle foreach.

En fait, en regardant votre exemple de plus près, vous voulez réellement être en mesure d'avancer la boucle for sans quitter le moment. Vous ne pouvez pas le faire avec une boucle foreach, mais vous pouvez décomposer une boucle foreach en ce qu'elle automatise réellement. Dans .NET, une boucle foreach est réellement rendue en tant qu'appel .GetEnumerator() sur l'objet IEnumerable (que votre objet this.ObjectNames est).

La boucle foreach est essentiellement ceci:

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 
    } 
} 
+0

Je suis désolé l'extrait de code que j'ai ajouté n'est pas très précis. Il y a plus de code à ignorer. Utiliser la pause n'aidera pas. J'ai mis à jour l'extrait de code pour être plus précis. – Amr

+2

Bien que j'aime votre réponse car elle résout le problème sans ajouter de logique supplémentaire; Je ne pense pas que ce soit une bonne solution. Je ne sais pas comment, dans le cas du PO, faire cela, mais structurer le code de manière à ce que cette logique folle ne soit pas nécessaire en premier lieu serait la meilleure solution. – nlaq

+0

Dommage que vous ne puissiez pas voter des commentaires ... +1 @Nelson aussi. –

2

Le mot-clé break; va 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(); 
    } 
} 
0

Vous pouvez utiliser "briser;" quitter le centre le plus proche pendant ou foreach.

1

Utilisez goto.

(je suppose que les gens seront en colère avec cette réponse, mais je pense vraiment qu'il est plus lisible que toutes les autres options.)