Bagaimana cara melewati pengulangan dari loop `foreach`?

324

Di Perl saya bisa melewatkan iteach (atau loop apa pun) dengan next;perintah.

Apakah ada cara untuk melewatkan iterasi dan melompat ke loop berikutnya di C #?

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

     // otherwise process number
 }
Brian
sumber
Memberitahu pengguna dengan input buruk mereka sama pentingnya dengan melewatkannya!
bermanfaatBee

Jawaban:

664

Kamu ingin:

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

    // do work
}

Berikut ini lebih lanjut tentang continuekata kunci .


Pembaruan: Menanggapi pertanyaan tindak lanjut Brian dalam komentar:

Bisakah Anda memperjelas lebih lanjut apa yang akan saya lakukan jika saya bersarang untuk loop, dan ingin melewatkan iterasi dari salah satu yang diperpanjang?

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

A continueselalu berlaku untuk lingkup penutup terdekat, jadi Anda tidak bisa menggunakannya untuk keluar dari loop terluar. Jika suatu kondisi seperti itu muncul, Anda harus melakukan sesuatu yang lebih rumit tergantung pada apa yang Anda inginkan, seperti breakdari loop dalam, kemudian continuepada loop luar. Lihat di sini untuk dokumentasi tentang breakkata kunci . Kata breakkunci C # mirip dengan lastkata kunci Perl .

Juga, pertimbangkan untuk mengambil saran Dustin untuk hanya memfilter nilai yang tidak ingin Anda proses sebelumnya:

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.
  }
}
John Feminella
sumber
Bisakah Anda memperjelas lebih lanjut apa yang akan saya lakukan jika saya bersarang untuk loop, dan ingin melewatkan iterasi dari salah satu yang diperpanjang? mis: untuk (int [] angka dalam penomoran angka) {untuk (int angka dalam angka) {// Apa yang harus dilakukan jika ingin melompati (angka / penomoran angka)}}
Brian
C # gotosebenarnya berguna untuk situasi yang sedang ditanyakan oleh @Brian. Tambahkan label seperti nextArray:di bagian bawah lingkaran luar, dan kemudian goto nextArray;ketika Anda ingin melompat ke sana.
Jacob Krall
55

Pendekatan lain adalah memfilter menggunakan LINQ sebelum loop dijalankan:

foreach ( int number in numbers.Where(n => n >= 0) )
{
    // process number
}
Dustin Campbell
sumber
2
+1. Meskipun itu bukan jawaban langsung terhadap pertanyaan, dalam praktiknya saya mungkin lebih suka solusi ini daripada yang saya usulkan. Menggunakan LINQ sepertinya kasus penggunaan umum yang baik untuk memfilter nilai loop yang tidak ingin Anda proses.
John Feminella
3
Apakah ini hanya lebih rapi atau akankah sebenarnya lebih cepat karena ada lebih sedikit yang harus diketahui? Saya menduga bahwa LINQ sangat dioptimalkan tetapi bagian LINQ harus terlebih dahulu melakukan peramalan sehingga secara teoritis jika dataset besar dan subset 'disaring' yang dihasilkan hampir sama besar, maka ini akan lebih lambat karena foreach harus terjadi dua kali? Jadi mungkin itu tergantung pada sub-dataset yang dihasilkan yang diharapkan?
Coops
25

Anda juga dapat membalik tes if:


foreach ( int number in numbers )
{
     if ( number >= 0 )
     {
        //process number
     }
 }
crashmstr
sumber
:) terima kasih! Saya datang dengan contoh dasar karena ada beberapa kriteria di awal loop yang tidak perlu diproses, dan yang lain adalah kesalahan yang perlu ditangkap.
Brian
4
Satu jawaban berdasarkan LINQ bagus dan memiliki keanggunan untuk itu, tetapi menggunakan pernyataan if tidak salah.
crashmstr
21
foreach ( int number in numbers )
{
    if ( number < 0 )
    {
        continue;
    }

    //otherwise process number
}
Tamas Czinege
sumber
16

Anda bisa menggunakan continuepernyataan itu.

Sebagai contoh:

foreach(int number in numbers)
{
    if(number < 0)
    {
        continue;
    }
}
Kev
sumber
16

Pendekatan lain menggunakan LINQ adalah:

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

Jika Anda ingin melewatkan yang pertama dalam sejumlah item.

Atau gunakan .SkipWherejika Anda ingin menentukan kondisi untuk dilewati.

Edmund Covington
sumber
Ini adalah cara paling sederhana (meskipun mungkin logika di dalamnya adalah sama) melakukan ini - sekarang Anda memiliki Linq tersedia. Meskipun Anda harus memastikan bahwa. Skip dipanggil hanya sekali karena alasan kinerja. (Ya, saya mengerti sekarang bahwa ini bukan jawaban langsung untuk pertanyaan OP, meskipun merupakan tambahan yang berharga untuk daftar jawaban ini). +1
B Charles H
8

Gunakan pernyataan lanjut:

foreach(object number in mycollection) {
     if( number < 0 ) {
         continue;
     }
  }
drewh
sumber
3
Tidak mengerti mengapa itu dibatalkan, ini salah karena ia mengulang "o", bukan "number"
Fortune
Setuju, mungkin ini salinan / tempel dari jawaban sebelumnya? Secara konseptual berharga karena merupakan pendahuluan, tetapi pastikan variabelnya konsisten.
Antonio Ciolino
0

Cara termudah untuk melakukannya adalah seperti di bawah ini:

//Skip First Iteration

foreach ( int number in numbers.Skip(1))

//Skip any other like 5th iteration

foreach ( int number in numbers.Skip(5))
Kashif
sumber