2011-11-16 17 views
9

संभव डुप्लिकेट:
Breaking out of a nested loopएक "अगर" कथन के साथ डबल foreach तोड़?

मैं तरह somthing मिला (सरल करने के लिए)

foreach (...) 
{ 
    foreach (...) 
    { 
     //Some code 

     if (statement) 
     { 
      break; 
     } 
    } 
} 

बात यह है कि मैं अपने बयान डबल foreach के लिए छोड़ना चाहते है लूप! मैं एक बूलियन के रूप में "ब्रेक फ्लैग" के बारे में सोच रहा हूं लेकिन क्या इससे बचने का कोई तरीका है?

+0

आप इसे 'का उपयोग कर Linq' और से बचने कर सकते हैं' SelectMany' यह एक एकल के लिए-प्रत्येक एक नेस्टेड लूप के बजाय पाश बनाने के लिए । –

+1

"ब्रेक फ्लैग" या गोटो – relaxxx

+0

@ मेरलीन मॉर्गन-ग्राहम: इसके बारे में कुछ भी नहीं जानते, इसे देखते हुए! –

उत्तर

7

आप लिंक और SelectMany का उपयोग करके पूरी तरह नेस्टेड लूप से बच सकते हैं।

foreach(var value in someValues) 
{ 
    foreach(var subValue in value.SubValues) 
    { 
     // ... 
     break; 
    } 
} 

आपका कोड बन जाएगा:

बजाय

foreach(var subValue in someValues.SelectMany(v => v.SubValues)) 
{ 
    // ... 
    break; 
} 

आप SubValues से अधिक है या आप नहीं पाश चयन करने के लिए, एक अतिरिक्त Where खंड में उस तर्क फेंक कुछ तर्क की जरूरत है।

foreach(var value in someValues) 
{ 
    if(value.IsMumsHairGreenToday) 
    { 
     foreach(var subValue in value.SubValues) 
     { 
      // ... 
      break; 
     } 
    } 
} 

के बजाय

आप लिख सकते हैं:

var subValues = someValues 
    .Where(v => v.IsMumsHairGreenToday) 
    .SelectMany(v => v.SubValues) 
    ; 

foreach(var subValue in subValues) 
{ 
    // ... 
    break; 
} 
+0

मैं लैम्ब्डा अभिव्यक्तियों के साथ confortable नहीं है, इसलिए ऐसा करने के बारे में नहीं सोचा, अच्छा लगता है क्योंकि मैं ब्रेकफ्लैग से बचता हूं और एक गोटो का उपयोग करता हूं! –

+3

@ गुइलाइम कॉग्रेन: जब तक आप उन्हें हर समय उपयोग नहीं करते तब तक आप कभी भी सहज नहीं रहेंगे। बीटीडब्ल्यू: कृपया, 'गोटो' का उपयोग न करें। मुझे परवाह नहीं है कि भीड़ क्या कहती है। यह सिर्फ पापी है :) –

1

आप एक विधि में उस तर्क को संपुटित और तोड़ने बिंदु पर लौट सकते हैं:

private SomeType CheckIfConditionOfNestedItems(IEnumerable enumerable) 
{ 
    foreach (var thing in enumerable) 
    { 
     foreach (...) 
     { 
      //Some code 

      if (statement) 
      { 
       return result; 
      } 
     } 
    } 
} 

स्पष्ट रूप से यह अपने कोड एक छोटे से बदलने के लिए आप की आवश्यकता हो सकती है, लेकिन यह भी लाभ यह है कि यह शायद कोड बनाता है जहां आपके पास डबल लूप बहुत अधिक पठनीय है।

+0

मेरे कोड -_- –

7

आप की कोशिश कर सकते:

bool leave = false; 
foreach (...) 
{ 
    foreach (...) 
    { 
     //Some code 

     if (statement) 
     { 
      leave = true; 
      break; 
     } 
    } 
    if (leave) break; 
} 

संपादित करें: ब्रेक झंडा

+1

हाँ, यह "ब्रेकफ्लैग" है जिसके बारे में मैं बात कर रहा था लेकिन इसे पसंद नहीं करता -_- –

+0

@ गुइलाउम कॉग्रेन: ओप, मैंने इसके बारे में नहीं पढ़ा ... – Marco

10

ले जाया आप goto उपयोग कर सकते हैं।

+0

क्या आप मजाक कर रहे हैं? – sll

+0

गोटो एफटीडब्ल्यू :) yay – jgauffin

+0

ब्रेक का उपयोग किए बिना ध्वज, गेटो कई नेस्टेड लूपों से बाहर निकलने का एकमात्र विकल्प है। – Tudor

5

निश्चित रूप से, आपको goto जांचना चाहिए।

+0

क्या कोई डाउनवॉटर कृपया विस्तार से बता सकता है कि आपने ऐसा क्यों किया? – DanielB

+1

किसने और क्यों गिरा दिया? सिर्फ इसलिए कि इसका सामान्य "तर्क" जो गेटो बुरा है? नहीं! यह! यह अभी भी किसी कारण के लिए भाषा में है और कभी-कभी, दुर्लभ होने पर मैं सहमत हूं, यह उपयोगी है। – dowhilefor

+2

यहां 2 से सहमत नहीं है - उसके पास एक वैध बिंदु है :) –

2

break केवल बाहरी लूप में ब्रेक स्थिति का परीक्षण करने के लिए आपको वर्तमान लूप से बाहर तोड़ने वाला है - जब तक कि आप goto कथन का उपयोग न करें।

एक चर यह करने का सबसे अच्छा तरीका प्रतीत होता है।

2

इमो कुछ मामलों में से एक जहां सावधान goto ठीक है।

संबंधित मुद्दे