ব্রেকিং / প্রস্থান নেভিগেশন জন্য vb.net


122

আমি কীভাবে ভিবি নেটনেস্ট বা লুপ থেকে বাঁচতে পারি?

আমি প্রস্থানটি ব্যবহারের চেষ্টা করেছি তবে এটি কেবল লুপের জন্য লাফিয়ে বা ভেঙে যায়।

নিম্নলিখিতগুলির জন্য আমি এটি কীভাবে তৈরি করতে পারি:

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বাইরের লুপটি দেখতে পারেন। আজ, ভিবি একটি ত্রুটি দেয়। অবশ্যই এটি 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। লুপের অভ্যন্তরে আপনি কতগুলি স্থানীয় ভেরিয়েবল ব্যবহার করেন তার উপর নির্ভর করে এটি আপনাকে অনেকগুলি পরামিতিগুলি পাস করতে পারে require বিকল্পটি হ'ল ব্লকটিকে একাধিক-লাইন ল্যাম্বডায় স্থাপন করা হবে, যেহেতু এটি স্থানীয় ভেরিয়েবলগুলির উপর বন্ধ হয়ে যাবে।

  • বুলিয়ান ভেরিয়েবল : আপনার নেস্টেড লুপের কত স্তর রয়েছে তার উপর নির্ভর করে এটি আপনার কোডটিকে কিছুটা কম পঠনযোগ্য করে তুলবে:

    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একটি বড় প্রকল্পে এটি ব্যবহার করতে যাচ্ছি কেবল আমার প্রোগ্রামিংয়ের দিনগুলি ক্বাবাসিক, আহ এরকম নিরীহ সময়ে মনে রাখার জন্য। অন্যথায় আমি একটি ডামি করতে যাব।
শার্কি

1
আমি Try/ Exit Tryপদ্ধতির পছন্দ করি , তবে আমি gotoবিকল্পটির কোনও অনুরাগী নই ।
এইচ

নোট করুন স্তর আরও গভীর হওয়ার সাথে সাথে "বুলিয়ান ভেরিয়েবল" পদ্ধতিতে একাধিক ভেরিয়েবল এবং পরীক্ষা করা দরকার Note এটি
পলাতক

1
@ আই এস এপ - আমার অভিজ্ঞতায় একাধিক বুলিয়ান ভেরিয়েবলের প্রয়োজন এটি বিরল। সাধারণত, একটি একক প্রস্থান শর্ত রয়েছে (যেমন "সম্পন্ন") এটি একবার মুখোমুখি হওয়ার পরে সমস্ত লুপের স্তরটি বেরিয়ে আসা উচিত। তবুও, আমি আলাদা পদ্ধতি তৈরি করা এবং "রিটার্ন" ব্যবহার করতে পছন্দ করি - এটি পরিষ্কারভাবে নেস্টেড কনস্ট্রাক্টকে আবদ্ধ করে।
নির্মাতা স্টিভ

16

একটি সাববুটিনে লুপগুলি রেখে কল করুন return


1
এটি লক্ষণীয় যে এই জাতীয় কলটির সাথে ওভারহেড যুক্ত রয়েছে যা সহজ gotoসমাধানে উপস্থিত নেই । অবশ্যই, যদি কোডটি পুনরায় ব্যবহারযোগ্য হয় তবে এটি ইতিমধ্যে কোনও ফাংশনে থাকা উচিত।
ড্যান বেচার্ড

কিভাবে এটি একটি ওভারহেড হতে পারে? @ ড্যান
আলটিয়ানো জেরুং

@ আল্টিয়ানো জেরুং ওয়েল, আমার উপরে মন্তব্যটি ধরে নিয়েছে যে সংকলকটি ফাংশন কলটিকে অনুকূলিত করবে না এবং ইনলাইন করবে না। সমস্ত ফাংশন কল (ধারণা করা হয় যে তারা সংকলকটি অন্তর্ভুক্ত নয়) বেস স্ট্যাক পয়েন্টারটি আপডেট করার জন্য পূর্বসূচী এবং উপসর্গের ওভারহেড রয়েছে (পাশাপাশি কল ডেস্ট্রাক্টরগুলির মতো অন্যান্য জিনিসগুলি করুন এবং ভাষা সমর্থন করে তবে আবর্জনা সংগ্রহ করুন)। জিনিসগুলির দুর্দান্ত স্কিমে এটি প্রায়শই মিনটিয়া হয় তবে এটি বিদ্যমান এবং এটি টাইট লুপগুলিতে দ্রুত স্পষ্ট হয়ে উঠতে পারে। en.wikedia.org/wiki/Function_prologue
ড্যান বেকার্ড

@ ড্যান ওয়েল, এটি আমার চেয়ে বেশি LOL। আমি মনে করি আমার ব্যবহারের ক্ষেত্রে এবং সময়ের সাথে কীভাবে প্রযুক্তি উন্নতি হয় সে সম্পর্কে আমার কখনই চিন্তা করার দরকার হবে না।
আলটিয়ানো জেরুং

2
@ আল্টিয়ানো জেরুং যদি কোনও অভিজ্ঞতা আমাকে শিখিয়ে থাকে তবে তা যথেষ্ট পরিমাণে এমনকি ক্ষুদ্রতম সমস্যাগুলিও যথেষ্ট গুরুত্বপূর্ণ হয়ে উঠেছে। সর্বদা হিসাবে, আপনার কোনও অনুমান করার আগে প্রোফাইল। :)
ড্যান বেচার্ড

3

বাইরের লুপটি কিছুক্ষণ লুপ করুন, এবং if স্টেটমেন্টে "যখন প্রস্থান করবেন"।


এটি 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`

Poppa।


এটি এই প্রশ্নের ক্ষেত্রে কীভাবে প্রযোজ্য তা দেখানোর পরামর্শ দিচ্ছি। প্রশ্নটি থেকে কোডটি নিন এবং এই পদ্ধতির ব্যবহার করতে এটি সম্পাদনা করুন।
টুলমেকারস্টেভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.