Jak wyskoczyć z pętli foreach w C #?


124

Jak wyrwać się z foreachpętli w języku C #, jeśli jeden z elementów spełnia wymagania?

Na przykład:

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

Zabawny. W Pythonie po prostu byś zrobił return "ok" in sList:- czy nie ma czegoś porównywalnego w C #?
Tim Pietzcker

8
@Tim Pietzcker: Oczywiście, że tak, zobacz odpowiedź spender. W rzeczywistości, po przyzwyczajeniu się do Linq, wiele imperatywnych kodów wygląda jak rysunki jaskiniowe.
R0MANARMY

Odpowiedzi:


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

return false;

Alternatywnie, jeśli po znalezieniu przedmiotu musisz wykonać inne czynności:

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
Sugerowałbym, że drugi przykład byłby lepiej przepisany nabool found = callFunctionInFirstCodeSnipper(list); // do stuff
ICR


55

Możesz uniknąć jawnych pętli, wybierając trasę LINQ:

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

23
lub po prostu użyj Contains("ok").
Graham Clark

7
@Graham Clark: Containszakłada, że iterujesz po pliku ICollection<T>. Anydziałałby na wszystkim, co jest tego typu IEnumerable<T>, aw tym przypadku pytanie nie wskazuje wyraźnie, jakiego rodzaju kolekcji jest iterowane ( Listchociaż jest całkiem niezłe).
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.
}

Powinien załatwić sprawę. Instrukcja break po prostu zakończy wykonywanie pętli, podczas gdy instrukcja return oczywiście zakończy całą funkcję. Sądząc po twoim pytaniu, możesz użyć zwrotu prawda; komunikat.


7

Możesz użyć tego, breakktóry wyskakuje z najbliższej otaczającej pętli lub możesz po prostu bezpośrednioreturn true


5

Użyj instrukcji „break”. Uważam za zabawne, że odpowiedź na twoje pytanie jest dosłownie w twoim pytaniu! Nawiasem mówiąc, proste wyszukiwanie w Google mogło dać ci odpowiedź.


3

Co powiesz na:

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

To powinno załatwić sprawę, jeśli wszystko, co chcesz zrobić, to sprawdzić, czy odpowiedź jest „OK” i zwrócić odpowiedź ...


2

To nie jest bezpośrednia odpowiedź na twoje pytanie, ale jest o wiele łatwiejszy sposób na zrobienie tego, co chcesz. Przynajmniej jeśli używasz .NET 3.5 lub nowszego. Nazywa się Enumerable.Contains

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

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

1

Albo wróć prosto z pętli:

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

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

Lub użyj 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
}

Jednak w twoim przypadku może być lepiej zrobić coś takiego:

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

Na pewno $nie jest prawidłowa składnia C #.
R0MANARMY

prawdopodobnie nie, jestem facetem z javascript / php. ale jest tu wystarczająco dużo kodu, aby zastosować działające rozwiązanie ... usunąłem $ i dodałem var .. prawdopodobnie nadal nie c +
johnny craig

w rzeczywistości varjest całkowicie poprawnym słowem kluczowym C #, więc jesteś dobry
R0MANARMY
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.