Come faccio a saltare fuori da un ciclo foreach in C #?


125

Come si interrompe un foreachciclo in C # se uno degli elementi soddisfa il requisito?

Per esempio:

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

Divertente. In Python faresti semplicemente: return "ok" in sList:non c'è qualcosa di paragonabile in C #?
Tim Pietzcker

8
@Tim Pietzcker: Certo che c'è, vedi la risposta di spender. In effetti, dopo essersi abituati a Linq, molti codici imperativi sembrano disegni rupestri.
R0MANARMY

Risposte:


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

return false;

In alternativa, se hai bisogno di fare altre cose dopo aver trovato l'oggetto:

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
Suggerirei che il secondo esempio sarebbe meglio riscritto inbool found = callFunctionInFirstCodeSnipper(list); // do stuff
ICR


55

È possibile evitare cicli espliciti prendendo la rotta LINQ:

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

23
o semplicemente usa Contains("ok").
Graham Clark

7
@ Graham Clark: Containspresume che tu stia iterando su un file ICollection<T>. Anyfunzionerebbe su qualsiasi cosa sia di tipo IEnumerable<T>, e in questo caso la domanda non indica esplicitamente su quale tipo di raccolta si sta iterando (a Listè comunque un'ipotesi abbastanza giusta).
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.
}

Dovrebbe fare il trucco. L'istruzione break terminerà semplicemente l'esecuzione del ciclo, mentre l'istruzione return terminerà ovviamente l'intera funzione. A giudicare dalla tua domanda potresti voler utilizzare il ritorno true; dichiarazione.


7

Puoi usare breakquale salta fuori dal loop che lo racchiude più vicino, oppure puoi semplicemente farlo direttamentereturn true


5

Usa l'istruzione "break". Trovo divertente che la risposta alla tua domanda sia letteralmente nella tua domanda! A proposito, una semplice ricerca su Google potrebbe averti dato la risposta.


3

che ne dite di:

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

Questo dovrebbe funzionare se tutto ciò che vuoi fare è controllare un "ok" e restituire la risposta ...


2

Non è una risposta diretta alla tua domanda, ma c'è un modo molto più semplice per fare quello che vuoi. Se stai usando .NET 3.5 o successivo, almeno. Si chiama Enumerable.Contains

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

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

1

O torna subito fuori dal giro:

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

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

Oppure usa 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
}

Tuttavia, nel tuo caso potrebbe essere meglio fare qualcosa del genere:

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;
}

Abbastanza sicuro $non è valida la sintassi C #.
R0MANARMY

probabilmente no, sono un tipo javascript / php. ma qui c'è abbastanza codice per applicare una soluzione funzionante ... ho rimosso $ e aggiunto var .. probabilmente ancora non c +
johnny craig

in realtà varè una parola chiave C # perfettamente valida, quindi sei bravo
R0MANARMY
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.