2009-03-17 17 views
247

In Perl è possibile saltare un'iterazione foreach (o qualsiasi loop) con un comando next;.Come saltare un'iterazione di un ciclo `foreach`?

C'è un modo per saltare un'iterazione e passare al ciclo successivo in C#?

foreach (int number in numbers) 
{ 
    if (number < 0) 
    { 
     // What goes here to skip over the loop? 
    } 

    // otherwise process number 
} 
+0

Notificare all'utente con il loro input non valido è importante quanto ignorarlo! – usefulBee

risposta

514

desiderato:

foreach (int number in numbers) // <--- go back to here --------+ 
{        //        | 
    if (number < 0)    //        | 
    {       //        | 
     continue; // Skip the remainder of this iteration. -----+ 
    } 

    // do work 
} 

Ecco di più sul continue keyword.


Aggiornamento: In risposta alla domanda di follow-up di Brian nei commenti:

Potrebbe chiarire ulteriormente che cosa avrei fatto se avessi annidati per i loop, e ha voluto ignorare l'iterazione di uno di quelli estesi?

for (int[] numbers in numberarrays) { 
    for (int number in numbers) { // What to do if I want to 
           // jump the (numbers/numberarrays)? 
    } 
} 

Un continue applica sempre alla portata racchiude vicina, quindi non si poteva usare per spezzare il ciclo più esterno. Se si verifica una condizione come questa, è necessario fare qualcosa di più complicato a seconda esattamente di ciò che si desidera, ad esempio break dal ciclo interno, quindi continue sul ciclo esterno. Vedi qui per la documentazione sullo break keyword. La parola chiave C# break è simile alla parola chiave Perl last.

Inoltre, prendere in considerazione il suggerimento di Dustin per filtrare i valori semplicemente non si desidera elaborare in anticipo:

foreach (var basket in baskets.Where(b => b.IsOpen())) { 
    foreach (var fruit in basket.Where(f => f.IsTasty())) { 
    cuteAnimal.Eat(fruit); // Om nom nom. You don't need to break/continue 
          // since all the fruits that reach this point are 
          // in available baskets and tasty. 
    } 
} 
+0

Potrebbe chiarire ulteriormente cosa farei se avessi annidato per cicli e volessi saltare l'iterazione di uno di quelli estesi? es: for (int [] numeri in numberarrays) { for (int numero in cifre) { // Cosa fare se vuole saltare i (numeri/numberarrays) } } s ' – Brian

+0

C# 'goto' è effettivamente utile per la situazione che @Brian sta chiedendo. Aggiungi un'etichetta come 'nextArray:' nella parte inferiore del ciclo esterno e quindi 'goto nextArray; 'quando vuoi saltarci sopra. –

17
foreach (int number in numbers) 
{ 
    if (number < 0) 
    { 
     continue; 
    } 

    //otherwise process number 
} 
7

Utilizzare l'istruzione continuano:

foreach(object o in mycollection) { 
    if(number < 0) { 
     continue; 
    } 
    } 
+3

Non capisco perché è upvoted, questo è sbagliato dal momento che esegue il loop su "o", non "numero" – Fortune

+0

D'accordo, forse questa è una copia/incolla da risposte precedenti? Concettualmente valido in quanto è un foreach, ma per favore assicurati che le variabili siano coerenti. –

12

È possibile utilizzare l'istruzione continue.

Ad esempio:

foreach(int number in numbers) 
{ 
    if(number < 0) 
    { 
     continue; 
    } 
} 
23

Si potrebbe anche capovolgere il caso di test:


foreach (int number in numbers) 
{ 
    if (number >= 0) 
    { 
     //process number 
    } 
} 
+0

:) Grazie! Vengo con un esempio di base perché c'erano alcuni criteri all'inizio del ciclo che non avrebbero dovuto essere elaborati e altri che erano errori che dovevano essere catturati. – Brian

+0

+1 per non utilizzare 'continua' – Trap

+4

Si prega di non utilizzare più ifs :( – Custodio

43

Un altro approccio è quello di filtrare utilizzando LINQ prima che il ciclo viene eseguito:

foreach (int number in numbers.Where(n => n >= 0)) 
{ 
    // process number 
} 
+2

+1. una risposta diretta alla domanda, in pratica probabilmente preferirei questa soluzione a quella che ho proposto.Utilizzo LINQ sembra un buon caso d'uso generale per filtrare i valori del ciclo che non vuoi processare –

+3

È solo più ordinato o sarà effettivamente più veloce in quanto c'è meno da prevedere? Sto indovinando che LINQ è molto ottimizzato ma la sezione LINQ dovrà foreach ad un certo punto in modo teorico se il set di dati è grande e il sottogruppo 'filtrato' risultante è quasi come grande, allora questo sarà più lento come un foreach deve accadere due volte? Quindi, forse dipende dal set di dati secondario risultante atteso? – Coops

12

Un altro approccio utilizzando linq è:

foreach (int number in numbers.Skip(1)) 
{ 
    // process number 
} 

Se si desidera saltare il primo di una serie di elementi.

Oppure utilizzare .SkipWhere se si desidera specificare una condizione per saltare.