Pemutusan / keluar bersarang untuk di vb.net


122

Bagaimana cara keluar dari nested for or loop in vb.net?

Saya mencoba menggunakan exit for tetapi hanya melompat atau merusak satu loop saja.

Bagaimana saya bisa membuatnya sebagai berikut:

for each item in itemList
     for each item1 in itemList1
          if item1.text = "bla bla bla" then
                exit for
          end if
     end for
end for

Yang benar-benar dibutuhkan VB adalah Exit For itemvarian dari pernyataan tersebut, mirip dengan Next item. Di "masa lalu yang indah" Anda bisa secara eksplisit Nextloop luar. Hari ini, VB memberikan kesalahan. Tentu saja, lebih "konstruktif" Exit For.
ysap

Jawaban:


199

Sayangnya, tidak ada exit two levels of forpernyataan, tetapi ada beberapa solusi untuk melakukan apa yang Anda inginkan:

  • Pergi . Secara umum, menggunakan gotoini dianggap praktik buruk (dan memang seharusnya begitu), tetapi menggunakan gotosemata-mata untuk maju melompat keluar dari pernyataan kontrol terstruktur biasanya dianggap OK, terutama jika alternatif adalah memiliki kode lebih rumit.

    For Each item In itemList
        For Each item1 In itemList1
            If item1.Text = "bla bla bla" Then
                Goto end_of_for
            End If
        Next
    Next
    
    end_of_for:
  • Blok luar tiruan

    Do
        For Each item In itemList
            For Each item1 In itemList1
                If item1.Text = "bla bla bla" Then
                    Exit Do
                End If
            Next
        Next
    Loop While False

    atau

    Try
        For Each item In itemlist
            For Each item1 In itemlist1
                If item1 = "bla bla bla" Then
                    Exit Try
                End If
            Next
        Next
    Finally
    End Try
  • Fungsi terpisah : Letakkan loop di dalam fungsi terpisah, yang dapat keluar dengan return. Ini mungkin mengharuskan Anda untuk meneruskan banyak parameter, tergantung pada berapa banyak variabel lokal yang Anda gunakan di dalam loop. Alternatifnya adalah menempatkan blok menjadi lambda multi-baris, karena ini akan membuat penutupan atas variabel lokal.

  • Variabel Boolean : Ini mungkin membuat kode Anda sedikit kurang dapat dibaca, bergantung pada berapa banyak lapisan loop bersarang yang Anda miliki:

    Dim done = False
    
    For Each item In itemList
        For Each item1 In itemList1
            If item1.Text = "bla bla bla" Then
                done = True
                Exit For
            End If
        Next
        If done Then Exit For
    Next

3
Tidak dapat mengatakan bahwa salah satu dari mereka lebih baik daripada gotofungsi lainnya jika itu benar-benar masuk akal.
Chris Marisic

2
Saya akan menggunakannya gotodalam proyek besar hanya untuk mengingat hari-hari pemrograman saya di qbasic, ah saat-saat yang begitu polos. kalau tidak, aku akan melakukan dummy do.
Sharky

1
Saya lebih suka Try/ Exit Trypendekatan, tetapi saya bukan penggemar gotoopsi.
JohnH

Perhatikan bahwa metode "Variabel Boolean" memerlukan beberapa variabel dan pengujian saat level bertingkat semakin dalam. Ini menjadi sangat ...
ysap

1
@ysap - Dalam pengalaman saya, sangat jarang membutuhkan banyak variabel boolean. Biasanya, ada satu kondisi keluar (misalnya "selesai") yang setelah ditemukan, semua level loop harus keluar. Namun demikian, saya lebih suka membuat metode terpisah, dan menggunakan "Return" - ini dengan rapi merangkum konstruksi bersarang.
ToolmakerSteve

16

Letakkan loop di subrutin dan panggil return


1
Perlu dicatat bahwa ada overhead yang terkait dengan panggilan semacam itu yang tidak ada dalam gotosolusi yang lebih sederhana . Tentu saja, jika kode dapat digunakan kembali, itu harus sudah dalam fungsi.
Dan Bechard

Bagaimana bisa menjadi overhead? @ Dan
Altiano Gerung

@AltianoGerung Nah, komentar saya di atas mengasumsikan compiler tidak mengoptimalkan dan inline pemanggilan fungsi. Semua panggilan fungsi (dengan asumsi mereka tidak dimasukkan oleh kompiler) memiliki overhead prolog dan epilog untuk memperbarui penunjuk tumpukan dasar (serta melakukan hal-hal lain seperti memanggil destruktor dan melakukan pengumpulan sampah jika bahasa mendukungnya). Ini sering kali merupakan hal-hal kecil dalam skema besar hal-hal, tetapi memang ada dan dapat dengan cepat menjadi jelas dalam putaran yang ketat. en.wikipedia.org/wiki/Function_prologue
Dan Bechard

@Dan Nah, itu di luar saya LOL. Saya pikir dengan kasus penggunaan saya dan bagaimana teknologi meningkat dari waktu ke waktu, saya tidak perlu khawatir tentang itu.
Altiano Gerung

2
@AltianoGerung Jika ada pengalaman yang mengajari saya, dengan skala yang cukup, bahkan masalah terkecil menjadi cukup besar untuk menjadi masalah. Seperti biasa, buat profil sebelum Anda membuat asumsi. :)
Dan Bechard

3

Buat loop luar menjadi loop sementara, dan "Exit While" di pernyataan if.


Ini melakukan hal yang sama persis seperti gotodengan lebih banyak instruksi, lebih banyak verbositas dan lebih banyak lekukan. Apa gunanya?
Dan Bechard

3

Saya telah bereksperimen dengan mengetik "keluar untuk" beberapa kali dan melihat itu berhasil dan VB tidak berteriak pada saya. Itu adalah pilihan yang saya kira tapi itu terlihat buruk.

Saya pikir opsi terbaik mirip dengan yang dimiliki oleh Tobias. Letakkan saja kode Anda dalam sebuah fungsi dan kembalikan ketika Anda ingin keluar dari loop Anda. Terlihat lebih bersih juga.

For Each item In itemlist
    For Each item1 In itemlist1
        If item1 = item Then
            Return item1
        End If
    Next
Next

Tidak, beberapa "Keluar Untuk" tidak menghasilkan perilaku yang diinginkan. Yang pertama keluar dari loop pertama , yang tambahan tidak pernah tercapai, jadi tidak berpengaruh. Selain saran itu, Anda sepertinya hanya mengulangi jawaban sebelumnya.
ToolmakerSteve

3
For i As Integer = 0 To 100
    bool = False
    For j As Integer = 0 To 100
        If check condition Then
            'if condition match
            bool = True
            Exit For 'Continue For
        End If
    Next
    If bool = True Then Continue For
Next

Jangan gunakan ini. Perilakunya salah. Sebaliknya, lihat solusi "variabel boolean" jawaban yang diterima dari enam tahun sebelumnya. Jika ini adalah pendekatan baru, saya akan menjelaskan apa yang membuatnya berperilaku tidak benar, tetapi tidak ada gunanya melakukannya, karena pendekatan tersebut sudah ditunjukkan dengan benar dalam jawaban sebelumnya.
ToolmakerSteve

0

Jika saya ingin keluar dari perulangan for-to, saya hanya menyetel indeks di luar batas:

    For i = 1 To max
        some code
        if this(i) = 25 Then i = max + 1
        some more code...
    Next`

Pak.


Saya sarankan untuk menunjukkan bagaimana ini berlaku untuk pertanyaan ini. Ambil kode dari pertanyaan, dan edit untuk menggunakan pendekatan ini.
ToolmakerSteve
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.