¿Cómo salto de un bucle foreach en C #?

124

¿Cómo salgo de un foreachbucle en C # si uno de los elementos cumple con el requisito?

Por ejemplo:

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
fuente
Gracioso. En Python simplemente harías return "ok" in sList:: ¿no hay algo comparable en C #?
Tim Pietzcker
8
@Tim Pietzcker: Por supuesto que sí, ver la respuesta del gastador. De hecho, después de acostumbrarse a Linq, muchos códigos imperativos parecen dibujos de cuevas.
R0MANARMY

Respuestas:

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

return false;

Alternativamente, si necesita hacer otras cosas después de haber encontrado el artículo:

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
fuente
66
Sugeriría que el segundo ejemplo se reescribiera mejorbool found = callFunctionInFirstCodeSnipper(list); // do stuff
ICR
83

Use break;y esto saldrá del bucle foreach

Francis Gilbert
fuente
55

Puede evitar bucles explícitos tomando la ruta LINQ:

sList.Any(s => s.Equals("ok"))
gastador
fuente
23
o simplemente usar Contains("ok").
Graham Clark
77
@Graham Clark: Containsasume que estás iterando sobre un ICollection<T>. Anyfuncionaría en cualquier cosa que sea de tipo IEnumerable<T>, y en este caso la pregunta no indica explícitamente sobre qué tipo de colección está iterando ( Listaunque es una suposición bastante justa).
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.
}

Debería hacer el truco. La declaración de interrupción simplemente terminará la ejecución del bucle, mientras que la declaración de retorno obviamente terminará la función completa. A juzgar por su pregunta, es posible que desee utilizar el retorno verdadero; declaración.

Cody
fuente
7

Puede usar breakqué salta del bucle de cierre más cercano, o puede simplemente directamentereturn true

vrxacs
fuente
5

Use la declaración 'break'. ¡Me parece gracioso que la respuesta a su pregunta esté literalmente en su pregunta! Por cierto, una simple búsqueda en Google podría haberle dado la respuesta.

Dynamichael
fuente
3

qué tal si:

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

Eso debería ser el truco si todo lo que quieres hacer es buscar un "ok" y devolver la respuesta ...

Dan Olesen
fuente
2

No es una respuesta directa a su pregunta, pero hay una manera mucho más fácil de hacer lo que quiere. Si está utilizando .NET 3.5 o posterior, al menos. Se llama Enumerable. Contiene

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

Regrese directamente del bucle:

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

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

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

Sin embargo, en su caso, podría ser mejor hacer algo como esto:

if(sList.Contains("ok"))
{
    // at least one element is "ok"
}
else
{
   // no elements are "ok"
}
Graham Clark
fuente
-2
var ind=0;
foreach(string s in sList){
    if(s.equals("ok")){
        return true;
    }
    ind++;
}
if (ind==sList.length){
    return false;
}
johnny craig
fuente
Bastante seguro de $que no es válida la sintaxis de C #.
R0MANARMY
probablemente no, soy un chico javascript / php. pero hay suficiente código aquí para aplicar una solución de trabajo ... eliminé $ y agregué var .. probablemente todavía no sea C +
johnny craig
En realidad vares un perfectamente válido C # palabra clave, por lo que está bien
R0MANARMY