Como pulo de um loop foreach em c #?

124

Como interrompo um foreachloop em C # se um dos elementos atende ao requisito?

Por exemplo:

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
fonte
Engraçado. Em Python, você simplesmente faria return "ok" in sList:- não há algo comparável em c #?
Tim Pietzcker
8
@ Tim Pietzcker: Claro que sim, veja a resposta do gastador. De fato, depois de se acostumar com o Linq, muitos códigos imperativos parecem desenhos de cavernas.
R0MANARMY

Respostas:

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

return false;

Como alternativa, se você precisar fazer outras coisas depois de encontrar o item:

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
fonte
6
Eu sugeriria que o segundo exemplo seria melhor reescrito parabool found = callFunctionInFirstCodeSnipper(list); // do stuff
ICR
83

Use break;e isso sairá do loop foreach

Francis Gilbert
fonte
55

Você pode evitar loops explícitos seguindo a rota LINQ:

sList.Any(s => s.Equals("ok"))
gastador
fonte
23
ou apenas use Contains("ok").
Graham Clark
7
@ Graham Clark: Containsassume que você está repetindo uma ICollection<T>. Anyfuncionaria em qualquer coisa que fosse do tipo IEnumerable<T>e, nesse caso, a pergunta não indica explicitamente em que tipo de coleção está sendo repetida (a Listé um palpite bastante justo).
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.
}

Deve fazer o truque. A instrução break acabará a execução do loop, enquanto a instrução return obviamente encerrará toda a função. A julgar pela sua pergunta, você pode querer usar o retorno true; declaração.

Cody
fonte
7

Você pode usar breakquais saltos do loop mais próximo, ou apenas diretamentereturn true

vrxacs
fonte
5

Use a instrução 'break'. Acho engraçado que a resposta à sua pergunta esteja literalmente na sua pergunta! A propósito, uma simples pesquisa no Google poderia ter lhe dado a resposta.

dynamichael
fonte
3

e quanto a:

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

Isso deve funcionar, se tudo o que você quer fazer é procurar um "ok" e retornar a resposta ...

Dan Olesen
fonte
2

Não é uma resposta direta à sua pergunta, mas existe uma maneira muito mais fácil de fazer o que você deseja. Se você estiver usando o .NET 3.5 ou posterior, pelo menos. É chamado Enumerable.Contains

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

Retorne direto do loop:

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

No entanto, no seu caso, pode ser melhor fazer algo assim:

if(sList.Contains("ok"))
{
    // at least one element is "ok"
}
else
{
   // no elements are "ok"
}
Graham Clark
fonte
-2
var ind=0;
foreach(string s in sList){
    if(s.equals("ok")){
        return true;
    }
    ind++;
}
if (ind==sList.length){
    return false;
}
johnny craig
fonte
Certamente $não é uma sintaxe C # válida.
R0MANARMY
provavelmente não, sou um cara de javascript / php. mas não há código suficiente aqui para aplicar uma solução de trabalho ... i removido do var $ e acrescentou .. provavelmente ainda não c +
johnny Craig
na verdade, varé um C # palavra-chave perfeitamente válido, então você é bom
R0MANARMY