Comment sortir d'une boucle foreach en C #?


125

Comment sortir d'une foreachboucle en C # si l'un des éléments répond à l'exigence?

Par exemple:

foreach(string s in sList){
      if(s.equals("ok")){
       //jump foreach loop and return true
     }
    //no item equals to "ok" then return false
}

Drôle. En Python, vous feriez simplement return "ok" in sList:- n'y a-t-il pas quelque chose de comparable en C #?
Tim Pietzcker

8
@Tim Pietzcker: Bien sûr que oui, voir la réponse de Spender. En fait, après s'être habitué à Linq, beaucoup de code impératif ressemble à des dessins rupestres.
R0MANARMY

Réponses:


221
foreach (string s in sList)
{
    if (s.equals("ok"))
        return true;
}

return false;

Alternativement, si vous devez faire d'autres choses après avoir trouvé l'élément:

bool found = false;
foreach (string s in sList)
{
    if (s.equals("ok"))
    {
        found = true;
        break; // get out of the loop
    }
}

// do stuff

return found;

6
Je suggérerais que le deuxième exemple serait mieux réécrit enbool found = callFunctionInFirstCodeSnipper(list); // do stuff
ICR


55

Vous pouvez éviter les boucles explicites en empruntant la route LINQ:

sList.Any(s => s.Equals("ok"))

23
ou simplement utiliser Contains("ok").
Graham Clark

7
@Graham Clark: Containssuppose que vous itérez sur un fichier ICollection<T>. Anyfonctionnerait sur tout ce qui est de type IEnumerable<T>, et dans ce cas, la question n'indique pas explicitement le type de collection sur laquelle elle itère ( Listc'est une estimation assez juste).
R0MANARMY

32
foreach (var item in listOfItems) {
  if (condition_is_met)
    // Any processing you may need to complete here...
    break; // return true; also works if you're looking to
           // completely exit this function.
}

Devrait faire l'affaire. L'instruction break terminera simplement l'exécution de la boucle, tandis que l'instruction return terminera évidemment toute la fonction. À en juger par votre question, vous voudrez peut-être utiliser le retour vrai; déclaration.


7

Vous pouvez utiliser breakquels sauts hors de la boucle englobante la plus proche, ou vous pouvez simplementreturn true


5

Utilisez l'instruction «break». Je trouve drôle que la réponse à votre question soit littéralement dans votre question! Au fait, une simple recherche sur Google aurait pu vous donner la réponse.


3

que diriez-vous:

return(sList.Contains("ok"));

Cela devrait faire l'affaire si tout ce que vous voulez faire est de vérifier un "ok" et de renvoyer la réponse ...


2

Ce n'est pas une réponse directe à votre question, mais il existe un moyen beaucoup plus simple de faire ce que vous voulez. Si vous utilisez .NET 3.5 ou version ultérieure, au moins. Il s'appelle Enumerable.

bool found = sList.Contains("ok");

1
foreach(string s in sList)
{
    if(s.equals("ok"))
    {
             return true;
    }
}
return false;

1

Soit vous revenez tout droit hors de la boucle:

foreach(string s in sList){
   if(s.equals("ok")){
      return true;
   }
}

// if you haven't returned by now, no items are "ok"
return false;

Ou utilisez break:

bool isOk = false;
foreach(string s in sList){
   if(s.equals("ok")){
      isOk = true;
      break; // jump out of the loop
   }
}

if(isOk)
{
    // do something
}

Cependant, dans votre cas, il pourrait être préférable de faire quelque chose comme ceci:

if(sList.Contains("ok"))
{
    // at least one element is "ok"
}
else
{
   // no elements are "ok"
}

-2
var ind=0;
foreach(string s in sList){
    if(s.equals("ok")){
        return true;
    }
    ind++;
}
if (ind==sList.length){
    return false;
}

La $syntaxe C # n'est pas vraiment valide.
R0MANARMY

probablement pas, je suis un gars javascript / php. mais il y a assez de code ici pour appliquer une solution de travail ... j'ai supprimé le $ et ajouté var .. probablement toujours pas c +
johnny craig

varest en fait un mot clé C # parfaitement valide, donc vous êtes bon
R0MANARMY
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.