2010-12-14 17 views
13

के बाद से foreach() सब एक सूची सदस्यों के माध्यम से विधि पाश, क्यों नहीं कर सकते एक को तोड़ने का उपयोग/ खंड जारी रखने के लिए, जबकि मैं उन्हें एक सामान्य foreach पाश के अंदर उपयोग कर सकते हैंforeach(): ब्रेक उपयोग नहीं कर सकते क्यों/अंदर जारी रखने के

lstTemp.ForEach(i=> 
{ 
    if (i == 3) 
    break; 
    //do sth 
} 
); 

त्रुटि:

"No enclosing loop out of which to break or continue"

+0

एक अच्छी तरह से लिखा foreach विस्तार आप इसे तोड़ने के लिए चाहते हैं, तो आप गलत वापस जाने के लिए अनुमति चाहिए। लेकिन मैं निश्चित रूप से यह नहीं कह सकता क्योंकि मुझे नहीं पता कि आपको अपना foreach कहां मिला है। यदि आपने इसे स्वयं लिखा है तो यह एक अच्छा विकल्प हो सकता है। – Tesserex

+0

ऐसा लगता है कि आप TakeWhile फ़ंक्शन चाहते हैं http://msdn.microsoft.com/en-us/library/bb534804%28v=VS.90%29.aspx – Juliet

+0

मुझे यहां एक बेहतर उत्तर मिला: http://stackoverflow.com/प्रश्न/3145563/सूची-foreach-break –

उत्तर

18

क्योंकि ForEach एक विधि है और नियमित foreach पाश नहीं है। ForEach विधि सरल कार्यों के लिए है, यदि आपको lstTemp पर नियमित foreach लूप के साथ फिर से तोड़ने या जारी रखने की आवश्यकता है।

आमतौर पर, ForEach इस तरह कार्यान्वित किया जाता है:

public static ForEach<T>(this IEnumerable<T> input, Action<T> action) 
{ 
    foreach(var i in input) 
    action(i); 
} 

यह एक सामान्य विधि कॉल है, action enclosing foreach बारे में कुछ पता नहीं है, इस प्रकार आप नहीं तोड़ सकते हैं।

+0

यह देखते हुए कि यह एक विधि कॉल है, क्या मैं सिर्फ ब्रेक के बजाय वापस आ सकता हूं? – Lance

+0

नहीं, आप बस विधि से ही वापस आ जाएंगे। आप इस तरह के बाहरी foreach से बाहर तोड़ने में सक्षम नहीं होंगे। – Femaref

17

मुमकिन है, क्योंकि आप एक लैम्ब्डा प्रयोग कर रहे हैं और लैम्ब्डा की सामग्री तथ्य यह है कि यह एक पाश के अंदर इस्तेमाल किया जा रहा करने के लिए अनजान हैं।

2

ब्रेक और जारी रखें सी # भाषा कीवर्ड जिन्हें संकलक समर्थन की आवश्यकता होती है। प्रत्येक के लिए, सी # कंपाइलर के लिए, बस एक विधि है।

4

तरह से मैं यह समझाने होता यह है: ForEach एक विधि, नहीं एक भाषा सुविधा है। सी #निर्माण उस भाषा की एक विशेषता है जिसमें दूसरी भाषा break और continue की अनुमति है।

मैं यह भी इंगित करूंगा (न्याय करने की कोशिश नहीं कर रहा हूं, सिर्फ अवलोकन कर रहा हूं) कि यह एक अच्छा उदाहरण है कि क्यों कुछ डेवलपर ForEach विधि के उपयोग पर ऑब्जेक्ट करते हैं: यह वास्तव में इस साधारण मामले में टाइपिंग को सहेजता नहीं है , इसके लिए आवश्यकतानुसार एक और पुनर्निर्देशन की आवश्यकता है, और इसमें foreach की सभी कार्यक्षमताएं हैं।

मेरी राय में मुख्य परिदृश्य जिसमें ForEach विधि समझ में आता है IEnumerable<T> पर विस्तार के रूप में - विधि कॉल की एक श्रृंखला के अंत में डालने के लिए। ऐसा लगता है (मेरे लिए) थोड़ा अजीब है कि उन्होंने इसे List<T> में जोड़ा।

0

क्योंकि आप सूची में प्रत्येक आइटम के लिए एक कार्रवाई प्रतिनिधि करते हैं।

10

बल्कि एक ब्रेक का उपयोग करने से, एक फिल्टर पहले इस तरह प्रदर्शन (यह सटीक फिल्टर आप की जरूरत नहीं हो सकता है, लेकिन बिंदु दिखाता है)

lstTemp.Where(i => i!= 3).ForEach(i=> // do sth); 
+0

-1 समीकरण नहीं। आपका कोड प्रत्येक i के लिए चलाएगा! = 3. प्रस्तुत कोड तब तक चलेगा जब तक मैं == 3. – Sergio

+0

यह 'जारी रखने' का सबसे अच्छा तरीका प्रतीत होता है। इसके अलावा हम सिर्फ 'ब्रेक' के लिए 'वापसी' लिख सकते हैं। – Nigiri

0

आप एक विस्तार विधि "ForEachWhile" कि लेता है लिख सकते हैं Function<T, bool> और झूठी होने पर रोकता है।

5

आइटम का ही हिस्सा पुनरावृति और पूरी तरह से तोड़ का अनुकरण करने के लिए, आप FirstOrDefault उपयोग कर सकते हैं:, 100000 आइटम के साथ

lstTemp.FirstOrDefault(i=> 
{ 
    if (i == 3) 
     return true; 

    //do stuff 

    return false; 
} 
); 

सूची के लिए करता है, तो 10 वीं आइटम 3 है इसे का उपयोग केवल 10 बार पुनरावृति होगी, Where समाधान काम करेगा, लेकिन पहले पूरी सूची को फिर से शुरू करें।

+1

'कहां' विधि संग्रह को पुन: सक्रिय नहीं करती है, देखें: स्थगित निष्पादन। –

+0

@ जेम्स शायद * iterate * सही शब्द नहीं है .. लेकिन सभी मिलान करने वाली वस्तुओं को खोजने के लिए, कहीं भी सभी वस्तुओं की जांच की जानी चाहिए, है ना? –

+1

इस बात का एक पठन है कि 'उपज' कीवर्ड कैसे काम करता है, क्योंकि LINQ क्वेरी कैसे काम करती है। यहां व्याख्या करने में बहुत लंबा समय है, लेकिन नहीं, सभी वस्तुओं की जांच नहीं की जानी चाहिए; केवल कॉल-चेन द्वारा अनुरोध किए जाने वाले कई आइटमों की जांच की जाएगी। बिल्कुल आपके 'FirstOrDefault' जैसा ही है, जो एक मैच को हिट होने तक पुन: सक्रिय करेगा। –

-1

मैं इसे

 list.ForEach((item) => 
     { 
      if(isBreak == false) do 
      { 
       if (isContinue) 
        break; 

       // TODO 
      } while (false); } 
     }); 
+0

यह वास्तव में प्रश्न का उत्तर नहीं देता है। ओपी पूछ रहा है कि वह सामान्य लूप की तरह ब्रेक/जारी क्यों नहीं कर सकता है। – Rafael

+0

'do-while' को हटाने का प्रयास करें और' ब्रेक ', एलओएल का उपयोग करें। – code4life

3

returnForEach में continue रूप में कार्य करेगा इस्तेमाल किया।

उदाहरण:

var list = new List<int>() {1, 2, 3, 4}; 
list.ForEach(i => 
    { 
     if (i == 3) 
      return; 
     Console.WriteLine(i); 
    } 
); 

प्रिंटों 1, 2, 4

3 - को छोड़ दिया।

1

क्योंकि फॉरएच एक विधि है और नियमित रूप से फोरैच लूप को ब्रेक के मामले में नियमित फोरैच लूप के साथ lstTemp पर फिर से चालू करने की आवश्यकता नहीं होती है, लेकिन अगर फॉरएच विधि के अंदर उपयोग का उपयोग जारी रहता है।

var lstTemp = new List<int>() {1, 2, 3, 4}; 
lstTemp.ForEach(i=> 
{ 
    if (i == 3) return; 
    //do sth 
    Console.WriteLine(i); 
}); 

आउटपुट: 1, 2, 4