2011-12-13 12 views
8

क्या कोई मुझे बता सकता है कि मुख्य लूप को कैसे तोड़ना है जब मैंने घोंसला लूप किया है?
उदाहरण *:ब्रेक नेस्टेड लूप

/*Main loop*/ 
for(int y = 0; y < 100; y+=10) 
{ 
    /*Sub loop*/ 
    for (int x = 0; x < 100; x += 10) 
    { 
     if(x == 60) 
     { 
      //Break the main loop 
     } 
    } 
} 

* यह कोड कुछ नहीं करते, यह सिर्फ एक उदाहरण

क्या मैं "तोड़ मुख्य लूप" टिप्पणी के स्थान पर रखना चाहिए है? जावा में ऐसे लेबल होते हैं जिन्हें मैं तोड़ सकता हूं (जब मैंने "मेनलूप" नामक मुख्य लूप पर एक लेबल सेट किया है, तो मैं "ब्रेक मेनलूप" लिख सकता हूं और यह मान्य होगा), लेकिन मैं यहां क्या कर सकता हूं?

सलाह में धन्यवाद!

+1

यदि संभव हो, तो इसे एक अलग विधि के अंदर रखें जिसे आप बस से बाहर कर सकते हैं, जो लूप को शॉर्ट सर्किट करेगा। –

+8

गोटो! अरे, रुको - तुम लोग कहाँ जा रहे हो? नमस्ते? –

उत्तर

7

समाप्ति का संकेत देने वाला झंडा का उपयोग करें:

for(int y = 0; y < 100; y+=10) 
{ 
    bool flag = false; 
    for(int x = 0; x < 100; x += 10) 
    { 
     if (x == 56) 
     { 
      flag = true; 
      break; 
     } 
    } 

    if(flag) break; 
} 
+1

ऐसा करने के लिए एक वर्बोज़ तरीका है। आप बस 'लूप सशर्त' में ध्वज की जांच कर सकते हैं। – Jon

+0

इस बारे में अच्छी बात यह है कि अन्य प्रोग्रामर के लिए यह समझना बहुत आसान है: शून्य आश्चर्य कारक। –

+0

@ जोन, मुझे नहीं लगता कि यह एक साफ शैली है जिसके लिए एक से अधिक स्थितियां हैं। – Tudor

10
  • refactor तो आप इस तरह से नेस्ट छोरों से बाहर निकलने की जरूरत नहीं है।
    return का प्रयोग अक्सर लूप को एक अलग कार्य में डालकर संभव है।
  • goto का उपयोग करें।
  • एक ध्वज (बदसूरत)
+2

-1 'goto' के लिए ... – IAbstract

+2

किसी को भी उच्च स्तर की भाषा में 'गोटो' का उपयोग नहीं करना चाहिए। – Jon

+4

आईएमओ फ्लैग-ब्रेक-चेकफ्लैग-ब्रेक गोटो से भी अधिक है। लेकिन निश्चित रूप से जहां भी संभव हो रेफैक्टरिंग पसंदीदा विकल्प है। – CodesInChaos

3

अक्सर अपनी बेहतर एक अलग समारोह में इस डाल करने के लिए का उपयोग करें और फिर एक 'वापसी'

void loop_de_loop() 
{ 
    for(int y = 0; y < 100; y+=10) 
    { 
     /*Sub loop*/ 
     for (int x = 0; x < 100; x += 10) 
     { 
      if(x == 56) 
      { 
       return; 
      } 
     } 
    } 
} 
+0

असली नेस्टेड लूप में मैं कुछ चीज़ की गणना कर रहा हूं। अगर मुझे उन्हें एक विधि में पास करना है तो यह वास्तव में बदसूरत होगा! – Bankin

+0

निर्भर करता है कि आप इसे कैसे करते हैं .... अक्सर ये चीजें गन्दा हो जाती हैं क्योंकि लोगों के पास बहुत सारे चर होते हैं और उन्हें एक संरचना में शामिल नहीं किया जाता है।आदर्श रूप से आप कई कार्यों के साथ समाप्त होते हैं जो एक संरचना पर काम करते हैं। (सरलीकृत ओओ)। –

4

कुछ लोग मुझसे के उपयोग के सुझाव देने के लिए गोली मार होगा करना

/*Main loop*/ 
for(int y = 0; y < 100; y+=10) 
{ 
    /*Sub loop*/ 
    for (int x = 0; x < 100; x += 10) 
    { 
     if(x == 56) 
     { 
      goto MainLoopDone; 
     } 
    } 
} 

MainLoopDone: 
// carry on here 
+0

GOTO भयानक – MethodMan

+4

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

+0

मैं स्पेगेटी कोड के बारे में पहले से सहमत हूं, मैं हमेशा ब्रेक का उपयोग करता हूं या – MethodMan

0
/*Main loop*/ 
for(int y = 0; y < 100; y+=10) 
{ 
    bool makeMeBreak = false; 

    /*Sub loop*/ 
    for (int x = 0; x < 100; x += 10) 
    { 
     if(x == 56) 
     { 

      //Break the main loop 
      makeMeBreak = true; 
      break; 
     } 
    } 
    if (makeMeBreak) break; 
} 
: goto बयान है, लेकिन कई छोरों को तोड़ते स्थानों यह बहुत उपयोगी (और कुशल) हो सकता है में से एक है 10
17

goto!

मैं इस लगातार ज्ञापन को समझने में विफल रहता हूं जो कहता है कि goto को "हानिकारक" माना जाता है। जब सही ढंग से उपयोग किया जाता है, यह बहुत शक्तिशाली है, और यह ऐसा मामला है।

+0

एक दिन जब कोई आपको तीन दशक पुराना फोरट्रान कोड देता है जिसे खराब लिखित GOTO के साथ मिर्च किया गया था, और आपको बग को ठीक करने के लिए कहता है, और आप पाते हैं कि यह रिफैक्टर के लिए _impossible_ है, तो आप समझेंगे। सर्वश्रेष्ठ प्रोग्रामर गोटो के साथ जादू कर सकते हैं। सबसे बुरा बुराई कर सकते हैं। –

+1

सर्वश्रेष्ठ प्रोग्रामर किसी भी दुःख के बिना 'गोटो' का उपयोग कर सकते हैं, और प्रक्रिया में सबसे कुशल कोड बना सकते हैं। –

+1

+1, नेस्टेड लूप तोड़ना कुछ (केवल?) गेटो इमो के स्वीकार्य उपयोगों में से एक है। एक झंडा का उपयोग करने से बहुत अधिक साफ है। –

2

मुझे नहीं पता कि सी # में नेस्टेड लूप से बाहर निकलने का कोई तरीका है, लेकिन मुझे एक समाधान का सुझाव देने की अनुमति दें।

आप मुख्य लूप को फ़ंक्शन में फेंक सकते हैं और उस फ़ंक्शन से बाहर लौट सकते हैं। आप return false; को समय-समय पर ब्रेक और return true; इंगित करने के लिए इंगित कर सकते हैं ताकि यह इंगित किया जा सके कि लूप सभी तरह से चला गया है, यदि यह मायने रखता है।

0

कोई अच्छा सामान्य जवाब नहीं है। 'सही रास्ता' वास्तविक समस्या पर निर्भर करता है। बाहरी लूप को फ़ंक्शन में डालने का सबसे अच्छा तरीका हो सकता है और फिर इसे निकालने के लिए return; का उपयोग करें। यह x=100; y=100; हो सकता है। यह done=true; हो सकता है। बिल्ली, यह goto (मजाक) भी हो सकता है।

2

झंडे, के रूप में टिप्पणी में सुझाव दिया है, शायद सबसे अच्छा तरीका है:

boolean someFlag = true; 

for(int y = 0; i < 100 && someFlag; y += 10) { 
    for(int x = 0; x < 100 && somFlag; x += 10) { 
    if(x == 56) 
     someFlag = false; 
    } 
} 
+0

यह केवल इतना छोटा है क्योंकि आंतरिक लूप के बाद और यदि के बाद कोई कोड नहीं है। उस कोड के साथ आपको दो ब्रेक और चेक जोड़ना होगा। – CodesInChaos

0

उचित नहीं है, लेकिन आप goto उपयोग कर सकते हैं। this देखें।

public class GotoTest1 
{ 
    static void Main() 
    { 
     int x = 200, y = 4; 
     int count = 0; 
     string[,] array = new string[x, y]; 

     // Initialize the array: 
     for (int i = 0; i < x; i++) 

      for (int j = 0; j < y; j++) 
       array[i, j] = (++count).ToString(); 

     // Read input: 
     Console.Write("Enter the number to search for: "); 

     // Input a string: 
     string myNumber = Console.ReadLine(); 

     // Search: 
     for (int i = 0; i < x; i++) 
     { 
      for (int j = 0; j < y; j++) 
      { 
       if (array[i, j].Equals(myNumber)) 
       { 
        goto Found; 
       } 
      } 
     } 

     Console.WriteLine("The number {0} was not found.", myNumber); 
     goto Finish; 

    Found: 
     Console.WriteLine("The number {0} is found.", myNumber); 

    Finish: 
     Console.WriteLine("End of search."); 


     // Keep the console open in debug mode. 
     Console.WriteLine("Press any key to exit."); 
     Console.ReadKey(); 
    } 
} 
/* 
Sample Input: 44 

Sample Output 
Enter the number to search for: 44 
The number 44 is found. 
End of search. 
*/ 

सलाह नहीं दी गई क्योंकि यह प्रवाह को समझने में कठोर बनाता है। पाठ्यक्रम का दूसरा विकल्प आंतरिक लूप में कुछ ध्वज सेट करना है और इसे बाहरी लूप में जांचना है, मैंने छूट दी है क्योंकि यह स्पष्ट है और मान लीजिए कि यह वैसे भी है .. :)

0

चूंकि आपने उल्लेख किया है, वहां break आदेश पर कोई लेबल नहीं है, तो आप कुछ इस तरह कर सकता है:

/*Main loop*/ 
bool fFound; 
for(int y = 0; y < 100 && !fFound; y+=10) 
{ 
    /*Sub loop*/ 
    for (int x = 0; x < 100; x += 10) 
    { 
     if(x == 56) 
     { 
      //Break the main loop 
      fFound = true; 
      break; //Break inner loop 
     } 
    } 
} 
0

के रूप में अन्य लोगों ने कहा, "सही" जवाब समस्या आप को सुलझाने रहे हैं पर निर्भर करता है। यदि आप कर सकते हैं, इसे छोटे टुकड़ों में तोड़ना पसंदीदा मार्ग है। इस मॉडल के साथ कुछ:

object MainLoop() 
{ 
    object result = null; 
    for(int y = 0; y < 100; y+=10) 
    { 
     result = SubLoop(y); 
     if (result != null) 
     { 
      break; 
     } 
    } 
    return result; 
} 

object SubLoop (int y) 
{ 
    object result = null; 
    for (int x = 0; x < 100; x += 10) 
    { 
     if(x == 56) 
     { 
      result = objectInstance; 
      break; 
     } 
    } 
    return result; 
} 

मेरी राय में, यह अलग-अलग स्तर एक भी समारोह से कई वापसी बयान के लिए करने के लिए बदसूरत है, अतिरिक्त झंडे का उपयोग करें, या (कंपकंपी) गोटो के उपयोग करें। लेकिन, कभी-कभी उनमें से एक आवश्यक है।

संपादित करें: यह इस पद्धति का उपयोग किसी तरह के एक उपयोगी वस्तु लौटने के लिए प्रदर्शन कर रहा है, तो आप "ग्राहक" या "IDataAccess" या "bool" या "वस्तु" के अलावा कुछ वापसी प्रकार के रूप में है, तो का उपयोग करके करते असली के लिए यह।

0

मैंने लाइनक्यू का उपयोग पहले दिलचस्प वस्तुओं को इकट्ठा करने के लिए किया था और फिर LINQ क्वेरी के परिणामों पर संचालन किया था। इस प्रकार नेस्टेड लूप को हटाकर एक लूप के साथ बदल दिया जाता है।