2010-02-12 12 views
7

का उपयोग करें क्या किसी को पता है कि लैम्बडा का उपयोग करने वाले जेनेरिक फॉरएच से बाहर निकलना संभव है? जैसेसी # निकास जेनेरिक प्रत्येक के लिए लैम्ब्डा

someList.ForEach(sl => 
    { 
    if (sl.ToString() == "foo") 
     break; 

    // continue processing sl here 
    // some processing code 
    } 
); 

यह कोड स्वयं संकलित नहीं होगा। मुझे पता है कि मैं नियमित foreach का उपयोग कर सकता हूं लेकिन स्थिरता के लिए मैं lambda का उपयोग करना चाहता हूँ।

बहुत धन्यवाद।

+0

क्या ऐसा कोई कारण है कि इसे इस तरह से किया जाना चाहिए? मैं हमेशा 'ब्रेक' से सावधान रहा हूं; एक स्विच-केस के बाहर, मैंने कभी उन्हें उपयोग करने की आवश्यकता नहीं देखी है। – FrustratedWithFormsDesigner

+5

मैं 'ब्रेक' और 'जारी रखें' का उपयोग करता हूं। कभी-कभी आप नहीं चाहते कि लूप बॉडी सभी तरह से निष्पादित करे, और 'ब्रेक'/'जारी रखें' कोड को सरल बनाता है। –

+0

क्या कोई कारण है कि आप इसके लिए लैम्ब्डा अभिव्यक्ति पसंद करते हैं? –

उत्तर

17

निश्चित रूप से। लेकिन सबसे पहले, ध्यान दें कि मैं इसके खिलाफ अनुशंसा करता हूं; मैं कहता हूं कि एक अनुक्रम ऑपरेटर का दुष्प्रभाव नहीं होना चाहिए, और एक बयान का दुष्प्रभाव होना चाहिए। यदि आप उस फॉरएच लैम्ब्डा में कुछ कर रहे हैं, तो इसे अनुक्रम ऑपरेटर की तरह दिखने के बजाय इसे फ़ोरैच लूप के शरीर में एक कथन दें।

उसने कहा, यह है कि आप क्या करते हैं। सबसे पहले, आप अपने आप को एक foreach कि मनमाने ढंग से दृश्यों पर काम करता है लिखते हैं, न सिर्फ सूचीबद्ध करता है:

public static void ForEach<T>(this IEnumerable<T> sequence, Action<T> action) 
{ 
    foreach(var item in sequence) action(item); 
} 

और अब आप इस तरह अपने को तोड़ने लिखें:

someList 
    .TakeWhile(x=>x.ToString() != "foo") 
    .ForEach(sl=> 
    {/*your action here*/}); 
+0

बार्ट डी स्मेट ने 'if'' से शुरू होने वाली कई 'ForEach' प्रकार की चीज़ें की: http://community.bartdesmet.net/blogs/bart/archive/2009/07/11/bart-s-control-library-not- क्या-यू-लगता है यह है-पार्ट-0.aspx। –

7

MSDN

से निम्नलिखित नियम लैम्ब्डा अभिव्यक्तियों में परिवर्तनीय दायरे पर लागू होते हैं:

snip

एक लैम्ब्डा अभिव्यक्ति एक गोटो बयान शामिल कर सकते हैं नहीं, बयान को तोड़ने, या बयान जिसका लक्ष्य है शरीर के बाहर या एक के शरीर में अज्ञात फ़ंक्शन निहित जारी है।

पता नहीं है कि यह आपके द्वारा पोस्ट किए गए कोड को देने में सहायता करता है या नहीं। प्रासंगिक उद्धरण एमएसडीएन लेख के अंत से है।

+0

अभी तक सबसे प्रासंगिक और पूर्ण उत्तर। मुझें यह पसंद है! –

1

चेतावनी: नीचे दिया गया कोड गंभीरता से नहीं लिया जाना चाहिए और मनोरंजन उद्देश्यों के लिए ही प्रदान किया जाता है!

आप 'अनुकरण' कर सकते हैं एक इस तरह एक प्रारंभिक वापसी के साथ जारी रखने के लिए:

Enumerable.Range(1, 20) 
      .ForEach(n => 
       { 
        if (n == 10) return; 
        Console.WriteLine("This is not 10: {0}", n); 
       }); 

कहा, मुझे लगता है लैम्ब्डा के भीतर है कि दुष्प्रभाव एक संकेत है कि आप गलत कर रहे हैं। इसके बजाए एक उचित foreach का प्रयोग करें। या TakeWhile की तरह कुछ, जैसे एरिक कृपया पहले से ही प्रदर्शित किया।

0

इस बारे में कैसे?

 Enumerable.Range(1, 10) 
     .Where(x => x % 2 != 0) 
     .ToList() 
     .ForEach(x => Console.WriteLine(x)); 
संबंधित मुद्दे