Vb.net में तोड़ना / बाहर निकलना


122

Vb.net में मैं नेस्टेड या लूप के लिए कैसे निकलूं?

मैंने इसके लिए बाहर निकलने का उपयोग करने की कोशिश की लेकिन यह कूद गया या केवल लूप के लिए केवल एक को तोड़ दिया।

मैं इसे निम्नलिखित के लिए कैसे बना सकता हूं:

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

वीबी को वास्तव में क्या चाहिए Exit For item, कथन का एक प्रकार है, जिसके समान है Next item। "अच्छे पुराने दिनों" में आप Nextबाहरी लूप को स्पष्ट रूप से देख सकते हैं । आज, VB एक त्रुटि देता है। बेशक, इसके Exit Forबजाय यह अधिक "रचनात्मक" है ।
ysap

जवाबों:


199

दुर्भाग्य से, कोई exit two levels of forबयान नहीं है, लेकिन कुछ वर्कअराउंड्स हैं जो आप चाहते हैं:

  • गोटो । सामान्य तौर पर, का उपयोग gotoकरना बुरा व्यवहार माना जाता है (और ठीक ही ऐसा है), लेकिन gotoकेवल संरचित नियंत्रण कथनों में से आगे कूदने के लिए आमतौर पर ओके माना जाता है, खासकर यदि विकल्प अधिक जटिल कोड होना है।

    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:
  • डमी बाहरी ब्लॉक

    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

    या

    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
  • अलग-अलग फ़ंक्शन : छोरों को एक अलग फ़ंक्शन के अंदर रखें, जिसके साथ बाहर निकला जा सकता है return। इसके लिए आपको कई मापदंडों को पारित करने की आवश्यकता हो सकती है, हालांकि, यह निर्भर करता है कि आप लूप के अंदर कितने स्थानीय चर का उपयोग करते हैं। ब्लॉक को मल्टी-लाइन लैंबडा में रखने का एक विकल्प होगा, क्योंकि यह स्थानीय चर पर एक क्लोजर बना देगा।

  • बूलियन चर : यह आपके कोड को थोड़ा कम पठनीय बना सकता है, जो इस बात पर निर्भर करता है कि आपके पास नेस्टेड छोरों की कितनी परतें हैं:

    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
यह नहीं कहा जा सकता है कि उनमें से कोई भी gotoफ़ंक्शन से बेहतर है अगर यह वास्तव में समझ में आता है।
क्रिस मैरिसिक

2
मैं gotoएक बड़ी परियोजना में उपयोग करने जा रहा हूं कि सिर्फ क्यूबसिक में मेरे प्रोग्रामिंग दिनों को याद करने के लिए, ऐसे निर्दोष समय पर आह। अन्यथा मैं एक डमी के लिए जाना होगा।
Sharky

1
मैं Try/ Exit Tryदृष्टिकोण को पसंद करता हूं , लेकिन मैं gotoविकल्प का प्रशंसक नहीं हूं ।
JohnH

ध्यान दें कि "बुलियन चर" विधि के लिए कई चर और परीक्षणों की आवश्यकता होती है क्योंकि घोंसला बनाने का स्तर गहरा हो जाता है। यह
भयंकर

1
@ysap - मेरे अनुभव में, कई बूलियन चर की आवश्यकता इसके दुर्लभ है। आमतौर पर, एक एकल निकास स्थिति होती है (जैसे "किया गया") कि एक बार सामना करने के बाद, सभी लूप स्तरों को बाहर किया जाना चाहिए। फिर भी, मैं एक अलग विधि बनाना पसंद करता हूं, और "रिटर्न" का उपयोग कर रहा हूं - यह साफ तौर पर नेस्टेड निर्माण को अतिक्रमण करता है।
टूलमेकर

16

छोरों को एक सबरूटीन में डालें और कॉल करें return


1
यह ध्यान देने योग्य है कि इस तरह के कॉल के साथ ओवरहेड जुड़ा हुआ है जो सरल gotoसमाधान में मौजूद नहीं है । बेशक, अगर कोड पुन: प्रयोज्य है तो यह पहले से ही किसी भी फ़ंक्शन में होना चाहिए।
डैन बीचर्ड

यह एक उपरि कैसे हो सकता है? @ डान
अल्तियानो गेरूंग

@AltianoGerung खैर, ऊपर मेरी टिप्पणी मानती है कि कंपाइलर फंक्शन कॉल को ऑप्टिमाइज़ और इनलाइन नहीं करता है। सभी फ़ंक्शन कॉल (यह मानते हुए कि वे संकलक द्वारा इनबिल्ड नहीं हैं) के पास आधार स्टैक पॉइंटर को अपडेट करने के लिए प्रस्तावना और उपसंहार का ओवरहेड है (साथ ही कॉल डिस्ट्रक्टर्स जैसी अन्य चीजें भी करें और कचरा संग्रह करें यदि भाषा इसका समर्थन करती है)। यह अक्सर चीजों की भव्य योजना में मिनुतिया है, लेकिन मौजूद है और जल्दी से तंग छोरों में स्पष्ट हो सकता है। en.wikipedia.org/wiki/Function_prologue
दान Bechard

@ अच्छा, यह मेरे से परे है। मुझे लगता है कि मेरे उपयोग के मामलों के साथ और समय के साथ प्रौद्योगिकी में सुधार कैसे होता है, मुझे इसके बारे में चिंता करने की आवश्यकता नहीं होगी।
अल्टियानो पियानो

2
@AltianoGerung अगर कुछ भी अनुभव मुझे सिखाया गया है, तो यह है कि पर्याप्त पैमाने के साथ, यहां तक ​​कि छोटी समस्याएं भी मामले के लिए काफी बड़ी हो जाती हैं। हमेशा की तरह, इससे पहले कि आप कोई भी धारणा बनाएं। :)
डैन बेहार्ड

3

बाहरी लूप को थोड़ी देर के लूप में बनाएं, और अगर "स्टेटमेंट में" बाहर निकलें।


यह gotoअधिक निर्देशों, अधिक क्रियात्मकता और अधिक इंडेंटेशन के साथ सटीक कार्य करता है । क्या बात है?
दान बेखर

3

मैंने कुछ समय के लिए "बाहर निकलने" टाइप करने के साथ प्रयोग किया है और देखा है कि यह काम करता है और वीबी मुझ पर चिल्लाता नहीं है। यह एक विकल्प है जो मुझे लगता है लेकिन यह सिर्फ बुरा लग रहा था।

मुझे लगता है कि सबसे अच्छा विकल्प टोबियास द्वारा साझा किया गया है। बस अपने कोड को किसी फ़ंक्शन में रखें और जब आप अपने लूप से बाहर निकलना चाहते हैं तो इसे वापस लौटा दें। क्लीनर भी लगता है।

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

नहीं, एकाधिक "बाहर निकलें" के लिए वांछित व्यवहार का परिणाम नहीं है। पहला पहला लूप बाहर निकलता है , अतिरिक्त कभी नहीं पहुंचता है, इसलिए कोई प्रभाव नहीं पड़ता है। उस सुझाव के अलावा, आपको लगता है कि पहले के उत्तर दोहराए गए हैं।
टूलमेकर

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

इसका उपयोग न करें। इसका व्यवहार गलत है। इसके बजाय छह साल पहले से स्वीकृत उत्तर "बूलियन चर" समाधान देखें। यदि यह एक नया दृष्टिकोण था, तो मैं समझाता हूँ कि यह क्या गलत व्यवहार करता है, लेकिन इसके लायक ऐसा नहीं है, क्योंकि यह दृष्टिकोण पहले से ही सही उत्तर में दिखाया गया था।
टूलमेकर

0

यदि मैं एक लूप के लिए बाहर निकलना चाहता हूं, तो मैं केवल सीमा से परे सूचकांक निर्धारित करता हूं:

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

बाबा।


मैं यह दिखाने की सलाह देता हूं कि यह इस सवाल पर कैसे लागू होता है। प्रश्न से कोड लें, और इस दृष्टिकोण का उपयोग करने के लिए इसे संपादित करें।
टूलमेकर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.