2011-06-28 21 views
71

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

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 
} 
+0

Gracioso. En Python simplemente harías 'return 'ok' en sList:' - ¿no hay algo comparable en C#? –

+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

Respuesta

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

return false; 

Como alternativa, si necesita hacer algunas otras cosas después de que haya 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; 
+6

Sugeriría que el segundo ejemplo sería mejor reescrito a 'bool found = callFunctionInFirstCodeSnipper (list); // hace cosas' – ICR

60

Uso break; y esto saldrá del foreach bucle

21
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 ciclo, mientras que la instrucción de retorno terminará obviamente toda la función. A juzgar por su pregunta, es posible que desee utilizar el retorno verdadero; declaración.

7

Usted puede utilizar break la que salta fuera del circuito de cerramiento más cercano, o simplemente puede directamente return true

47

Se podría evitar bucles explícitas tomando la ruta LINQ:

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

o simplemente usa 'Contains (" ok ")'. –

+6

@Graham Clark: 'Contiene' supone que está iterando sobre un' ICollection '.'Any' funcionaría en cualquier cosa del tipo' IEnumerable ', y en este caso la pregunta no indica explícitamente qué tipo de colección está iterando (sin embargo, una' List' es bastante aproximada). – R0MANARMY

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

Bastante seguro '' '' no es una sintaxis válida de C#. – R0MANARMY

+0

probablemente no, soy un tipo javascript/php. pero aquí hay suficiente código para aplicar una solución de trabajo ... eliminé $ y agregué var ... probablemente todavía no c + –

+0

en realidad 'var' es una palabra clave C# válida, por lo que está bien – R0MANARMY

1

Cualquiera de los dos retornos directamente fuera del circuito:

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 utilice 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 que hacer algo como esto:

if(sList.Contains("ok")) 
{ 
    // at least one element is "ok" 
} 
else 
{ 
    // no elements are "ok" 
} 
0

No es una respuesta directa a su pregunta, pero hay una mucho más fácil forma de hacer lo que quieras Si usa .NET 3.5 o posterior, al menos. Se llama Enumerable.Contains

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

¿qué tal:

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

Que debe hacer el truco si todo lo que quiere hacer es de verificación de un "ok" y devolver la respuesta ...

4

Usa la instrucción 'break'. ¡Me parece cómico que la respuesta a tu pregunta esté literalmente en tu pregunta! Por cierto, una simple búsqueda en Google podría haberle dado la respuesta.

Cuestiones relacionadas