Vb.net için yuvalanmış kırma / çıkış


122

Vb.net'te iç içe geçmiş for veya döngüden nasıl çıkabilirim?

Çıkış için kullanmayı denedim, ancak yalnızca döngü için yalnızca bir tanesi atladı veya kırıldı.

Aşağıdakiler için nasıl yapabilirim:

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

VB'nin gerçekten ihtiyacı olan şey Exit For item, ifadesinin bir çeşididir Next item. "Eski güzel günlerde" açıkça Nextdış döngü yapabiliyordunuz. Bugün, VB bir hata veriyor. Tabii Exit Forbunun yerine daha "yapıcı" .
ysap

Yanıtlar:


199

Maalesef herhangi bir exit two levels of foraçıklama yok , ancak istediğinizi yapmak için birkaç geçici çözüm var:

  • Goto . Genel olarak, kullanmak kötü bir uygulamagoto olarak kabul edilir (ve haklı olarak öyle), ancak gotoyalnızca yapılandırılmış kontrol ifadelerinden ileriye doğru bir atlama için kullanılması, özellikle alternatif daha karmaşık bir koda sahip olmaksa, genellikle uygun kabul edilir.

    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:
  • Kukla dış blok

    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

    veya

    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
  • Ayrı işlev : Döngüleri, ile çıkılabilen ayrı bir işlevin içine koyun return. Bu, döngü içinde kaç yerel değişken kullandığınıza bağlı olarak birçok parametreyi iletmenizi gerektirebilir. Bir alternatif, bloğu çok satırlı bir lambda'ya koymak olabilir, çünkü bu, yerel değişkenler üzerinde bir kapanma yaratacaktır.

  • Boolean değişkeni : Bu, kaç tane iç içe döngü katmanına sahip olduğunuza bağlı olarak kodunuzu biraz daha az okunabilir hale getirebilir:

    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
gotoGerçekten mantıklıysa , bunlardan herhangi birinin işlevden diğerinden daha iyi olduğunu söyleyemem .
Chris Marisic

2
Bunu gotobüyük bir projede, sadece qbasic'deki programlama günlerimi, ah böyle masum zamanlarda hatırlamak için kullanacağım . aksi takdirde aptal bir şey yapmaya giderdim.
Sharky

1
Try/ Exit TryYaklaşımını tercih ederim , ancak gotoseçeneğin hayranı değilim .
JohnH

"Boolean değişkeni" yönteminin birden çok değişken gerektirdiğini ve yuvalama düzeyi derinleştikçe testlerin yapıldığını unutmayın. Bu
acayip

1
@ysap - Deneyimlerime göre, birden fazla boole değişkenine ihtiyaç duyulması nadirdir. Tipik olarak, bir kez karşılaşıldığında, tüm döngü seviyelerinden çıkılması gereken tek bir çıkış koşulu vardır (örneğin "tamamlandı"). Yine de, ayrı bir yöntem yapmayı ve "Return" kullanmayı tercih ederim - bu iç içe geçmiş yapıyı temiz bir şekilde kapsüller.
ToolmakerSteve

16

Döngüleri bir alt programa koyun ve return


1
Daha basit gotoçözümde bulunmayan böyle bir çağrı ile ilişkili ek yükün olduğunu belirtmek gerekir . Elbette, kod yeniden kullanılabilirse zaten bir işlevde olmalıdır.
Dan Bechard

Nasıl bir ek yük olabilir? @Dan
Altiano Gerung

@AltianoGerung Yukarıdaki yorumum, derleyicinin işlev çağrısını optimize etmediğini ve satır içi yapmadığını varsayıyor. Tüm işlev çağrıları (derleyici tarafından satır içi olmadığı varsayılarak), temel yığın işaretçisini güncellemek için önsöz ve sonsözün ek yüküne sahiptir (ayrıca, çağrı yıkıcıları ve dil destekliyorsa çöp toplama gibi başka şeyler de yapar). Bu, genellikle şeylerin büyük şemasında küçük bir ayrıntıdır, ancak vardır ve sıkı döngülerde hızla belirginleşebilir. en.wikipedia.org/wiki/Function_prologue
Dan Bechard

@Dan Eh, bu benim ötesinde LOL. Kullanım örneklerim ve teknolojinin zaman içinde nasıl geliştiğini düşünüyorum, bunun için asla endişelenmeme gerek kalmayacak.
Altiano Gerung

2
@AltianoGerung Tecrübenin bana öğrettiği bir şey varsa, o da yeterli ölçekte, en küçük problemler bile önemli olacak kadar büyük hale gelir. Her zaman olduğu gibi, herhangi bir varsayımda bulunmadan önce profilinizi çıkarın. :)
Dan Bechard

3

Dış döngüyü bir while döngüsü ve if deyiminde "While Exit While" yapın.


Bu goto, daha fazla talimat, daha fazla ayrıntı ve daha fazla girinti ile aynı şeyi yapar . Amaç ne?
Dan Bechard

3

Birkaç kez "çıkış" yazmayı denedim ve işe yaradığını ve VB'nin bana bağırmadığını fark ettim. Sanırım bu bir seçenek ama kötü görünüyordu.

En iyi seçeneğin Tobias'ın paylaştığına benzer olduğunu düşünüyorum. Kodunuzu bir işleve koyun ve döngülerinizden çıkmak istediğinizde geri dönmesini sağlayın. Daha temiz görünüyor.

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

Hayır, birden fazla "Şunun İçin Çık" işlemi istenen davranışla sonuçlanmaz. İlki çıkar birinci döngü, ek olanlar ulaştı asla, bu yüzden hiçbir etkisi yoktur. Bu önerinin dışında, önceki cevapları basitçe tekrarlamış görünüyorsunuz.
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

Bunu kullanmayın. Davranışı yanlış. Bunun yerine, kabul edilen cevabın altı yıl önceki "mantıksal değişken" çözümüne bakın. Yeni bir yaklaşım olsaydı, yanlış davranmasına neyin sebep olduğunu açıklardım, ancak bu yaklaşım daha önceki cevapta zaten doğru bir şekilde gösterildiğinden, buna değmez.
ToolmakerSteve

0

Bir for-to döngüsünden çıkmak istersem, endeksi sınırın ötesine ayarlarım:

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

Baba.


Bunun bu soru için nasıl geçerli olduğunu göstermenizi öneririm. Sorudaki kodu alın ve bu yaklaşımı kullanmak için düzenleyin.
ToolmakerSteve
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.