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

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;

66
Sugeriría que el segundo ejemplo se reescribiera mejorbool found = callFunctionInFirstCodeSnipper(list); // do stuff
ICR


55

Puede evitar bucles explícitos tomando la ruta LINQ:

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

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.


7

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


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.


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 ...


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");

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

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

-2
var ind=0;
foreach(string s in sList){
    if(s.equals("ok")){
        return true;
    }
    ind++;
}
if (ind==sList.length){
    return false;
}

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.