2008-12-11 18 views
21

debe ser simple y rápida: Quiero un C# equivalente al siguiente código Java:C# equivalente a Java's continue <label>?

orig: for(String a : foo) { 
    for (String b : bar) { 
    if (b.equals("buzz")) { 
     continue orig; 
    } 
    } 
    // other code comes here... 
} 

Edición: bien parece que no hay tal equivalente (hey - Jon mismo Skeet dijo que no hay, que lo resuelve;)). Entonces la "solución" para mí (en su equivalente Java) es:

for(String a : foo) { 
    bool foundBuzz = false; 
    for (String b : bar) { 
    if (b.equals("buzz")) { 
     foundBuzz = true; 
     break; 
    } 
    } 
    if (foundBuzz) { 
    continue; 
    } 
    // other code comes here... 
} 

Respuesta

23

No creo que haya un equivalente, me temo. Tendrás que usar un booleano o simplemente "ir" al final del interior del bucle externo. Es incluso más complicado de lo que parece, ya que una etiqueta debe aplicarse a una declaración, pero no queremos hacer nada aquí. Sin embargo, creo que esto hace lo que quiere:

using System; 

public class Test 
{ 
    static void Main() 
    { 
     for (int i=0; i < 5; i++) 
     { 
      for (int j = 0; j < 5; j++) 
      { 
       Console.WriteLine("i={0} j={1}", i, j); 
       if (j == i + 2) 
       { 
        goto end_of_loop; 
       } 
      } 
      Console.WriteLine("After inner loop"); 
      end_of_loop: {} 
     } 
    } 
} 

Me fuertemente recomendar una forma diferente de expresar esto, sin embargo. No puedo pensar que hay muchas veces donde no hay una forma más legible de codificarlo.

+13

Es un poco sorprendente que C# tiene 'goto', pero no' ruptura/continuar

+0

C# es más fiel a sus raíces C que Java. ¡También tiene estructuras y punteros! –

2

En VB.Net, puede tener un solo while bucle y un for bucle y luego exit el nivel de alcance deseado.

En C#, ¿quizás break;?

Eso podría salir del bucle interno y permitir que el bucle exterior continúe.

0

Creo que está buscando la palabra clave simple "continuar" ... Sin embargo, al no ser un tipo Java, realmente no entiendo qué es lo que el fragmento de código está tratando de lograr.

Considere lo siguiente, sin embargo.

foreach(int i in new int[] {1,2,3,5,6,7}) 
{ 
    if(i % 2 == 0) 
     continue; 
    else 
     Console.WriteLine(i.ToString());  
} 

La instrucción continue en la línea 4 es una instrucción para continuar con el ciclo en el siguiente valor. La salida aquí sería 1,3,5 y 7.

La sustitución de "continuar" con la "ruptura", de la siguiente manera,

foreach(int i in new int[] {1,2,3,5,6,7}) 
{ 
    if(i % 2 == 0) 
     break; 
    else 
     Console.WriteLine(i.ToString());  
} 

dará la salida 1. break ordena que el bucle se termina, la mayoría comúnmente utilizado cuando desea detener el procesamiento cuando se cumple una condición.

Espero que esto le proporcione algo de lo que estaba buscando, pero si no, puede volver a preguntar.

+0

gracias, pero sé la diferencia entre continuar y romper. ;-) la cosa es: tengo dos bucles anidados.y si ocurre una cierta condición en el bucle interno, quiero "continuar" el bucle externo. – Epaga

+1

Lo siento, no quise enseñarte a chupar huevos. La falla es mía por no leer la pregunta adecuadamente ... – ZombieSheep

0

Se podría hacer algo como:

for(int i=0; i< foo.Length -1 ; i++) { 
    for (int j=0; j< bar.Length -1; j++) { 
    if (condition) { 
     break; 
    } 
    if(j != bar.Length -1) 
     continue; 
    /*The rest of the code that will not run if the previous loop doesn't go all the way*/ 
    } 
} 
+1

el problema aquí es que el resto del código está DESPUÉS del ciclo anidado, no en él. – Epaga

+0

whoops Acabo de notar en mi primer ejemplo que tenía la línea incorrecta para el comentario "// código aquí". lo siento. – Epaga

+0

Puede establecer una bandera antes de romper y verificar la bandera después del bucle. Y si realmente quiere que su código esté formalmente 'estructurado', establezca j = bar.Length en lugar de usar 'break'. –

8

Otra posibilidad es hacer una función con el bucle interno:

void mainFunc(string[] foo, string[] bar) 
{ 
    foreach (string a in foo) 
    if (hasBuzz(bar)) 
     continue; 
    // other code comes here... 
} 

bool hasBuzz(string[] bar) 
{ 
    foreach (string b in bar) 
    if (b.equals("buzz")) 
     return true; 
    return false; 
} 
+0

Me gusta más esto, porque tales bucles en funciones a menudo tienen una buena semántica (=> buen nombre) propia y son por lo tanto, reutilizable. – Spoc