Wie springe ich in C # aus einer foreach-Schleife?

124

Wie kann ich foreachin C # aus einer Schleife ausbrechen, wenn eines der Elemente die Anforderung erfüllt?

Beispielsweise:

foreach(string s in sList){
      if(s.equals("ok")){
       //jump foreach loop and return true
     }
    //no item equals to "ok" then return false
}
Steven Zack
quelle
Komisch. In Python würden Sie es einfach tun return "ok" in sList:- gibt es in C # nichts Vergleichbares?
Tim Pietzcker
8
@ Tim Pietzcker: Natürlich gibt es, siehe die Antwort des Spenders. Nachdem Sie sich an Linq gewöhnt haben, sehen viele wichtige Codes wie Höhlenzeichnungen aus.
R0MANARMY

Antworten:

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

return false;

Alternativ, wenn Sie einige andere Dinge tun müssen, nachdem Sie den Gegenstand gefunden haben:

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

// do stuff

return found;
mbillard
quelle
6
Ich würde vorschlagen, dass das zweite Beispiel besser umgeschrieben wirdbool found = callFunctionInFirstCodeSnipper(list); // do stuff
ICR
83

Verwenden Sie break;und dies verlässt die foreach-Schleife

Francis Gilbert
quelle
55

Sie können explizite Schleifen vermeiden, indem Sie die LINQ-Route verwenden:

sList.Any(s => s.Equals("ok"))
Spender
quelle
23
oder einfach benutzen Contains("ok").
Graham Clark
7
@ Abraham Clark: Angenommen Contains, Sie iterieren über eine ICollection<T>. Anywürde auf alles funktionieren, was vom Typ ist IEnumerable<T>, und in diesem Fall gibt die Frage nicht explizit an, über welche Art von Sammlung sie iteriert (a Listist jedoch eine ziemlich faire Vermutung).
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.
}

Sollte den Trick machen. Die break-Anweisung beendet nur die Ausführung der Schleife, während die return-Anweisung offensichtlich die gesamte Funktion beendet. Nach Ihrer Frage zu urteilen, möchten Sie möglicherweise die Rückgabe true verwenden. Aussage.

Cody
quelle
7

Sie können verwenden, breakwelche aus der nächsten umschließenden Schleife herausspringen, oder Sie können einfach direktreturn true

vrxacs
quelle
5

Verwenden Sie die Anweisung 'break'. Ich finde es witzig, dass die Antwort auf Ihre Frage buchstäblich in Ihrer Frage liegt! Eine einfache Google-Suche hätte Ihnen übrigens die Antwort geben können.

Dynamichael
quelle
3

wie wäre es mit:

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

Das sollte den Trick machen, wenn Sie nur nach einem "OK" suchen und die Antwort zurückgeben möchten ...

Dan Olesen
quelle
2

Es ist keine direkte Antwort auf Ihre Frage, aber es gibt eine viel einfachere Möglichkeit, das zu tun, was Sie wollen. Wenn Sie mindestens .NET 3.5 oder höher verwenden. Es heißt Enumerable.Contains

bool found = sList.Contains("ok");
Kann Gencer
quelle
1
foreach(string s in sList)
{
    if(s.equals("ok"))
    {
             return true;
    }
}
return false;
Harryovers
quelle
1

Entweder kehren Sie direkt aus der Schleife zurück:

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

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

Oder verwenden Sie 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
}

In Ihrem Fall ist es jedoch möglicherweise besser, Folgendes zu tun:

if(sList.Contains("ok"))
{
    // at least one element is "ok"
}
else
{
   // no elements are "ok"
}
Graham Clark
quelle
-2
var ind=0;
foreach(string s in sList){
    if(s.equals("ok")){
        return true;
    }
    ind++;
}
if (ind==sList.length){
    return false;
}
Johnny Craig
quelle
Ziemlich sicher $ist keine gültige C # -Syntax.
R0MANARMY
wahrscheinlich nicht, ich bin ein Javascript / PHP-Typ. aber es gibt genug Code hier, um eine funktionierende Lösung anzuwenden ... Ich entfernte das $ und fügte var hinzu .. wahrscheinlich immer noch nicht c +
Johnny Craig
ist eigentlich varein perfekt gültiges C #
-Schlüsselwort