2012-11-15 41 views
5

क्या उपरोक्त के भीतर सभी वस्तुओं को लौटने वाली उपज के लिए मानक पैटर्न मौजूद है?उपज वापसी के साथ संख्यात्मक वस्तुओं को संभालने के लिए उचित पैटर्न क्या है?

public IEnumerable<object> YieldReturningFunction() 
    { 

     ... 
     [logic and various standard yield return] 
     ... 

     foreach(object obj in methodReturningEnumerable(x,y,z)) 
     { 
      yield return obj; 
     } 

    } 

एक foreach पाश की स्पष्ट उपयोग केवल मेरे लिए कोड गंध पहचानने की Enumerable reeks का परिणाम लौटाने के लिए:

अधिक अक्सर जो मुझे पसंद नहीं मैं अपने कोड निम्नलिखित पैटर्न को दर्शाती के कुछ पाते हैं।

जाहिर है मैं स्पष्ट रूप से एक Enumerable निर्माण और इसे करने के लिए प्रत्येक मानक उपज वापसी का परिणाम जोड़ने के साथ ही एक methodReturningEnumerable के परिणामों की सीमा को जोड़ने के द्वारा मेरे कोड की जटिलता में वृद्धि उपज वापसी के उपयोग का परित्याग कर सकता है । यह दुर्भाग्यपूर्ण होगा, क्योंकि मैं उम्मीद कर रहा था कि उपज रिटर्न पैटर्न का प्रबंधन करने का एक बेहतर तरीका मौजूद है।

+1

आप 'उपज foreach' के लिए पूछ रहे हैं, जो मौजूद नहीं है। – SLaks

+3

संभावित डुप्लिकेट [आईनेमेरेबल के साथ नेस्टेड उपज रिटर्न] (http://stackoverflow.com/questions/1270024/nested-yield-return-with-ienumerable) – Euphoric

+0

[यील्ड रिटर्न कई?] के संभावित डुप्लिकेट (http: // stackoverflow .com/प्रश्न/3851997/उपज-वापसी-कई) – nawfal

उत्तर

5

नहीं, उसके आस-पास कोई रास्ता नहीं है।

यह एक सुविधा है जिसका अनुरोध किया गया है, और यह एक बुरा विचार नहीं है (yield foreach या समकक्ष अन्य भाषाओं में मौजूद है)।

इस बिंदु पर माइक्रोसॉफ्ट ने इसे लागू करने के लिए समय और पैसा आवंटित नहीं किया है। वे भविष्य में इसे लागू कर सकते हैं या नहीं भी कर सकते हैं; मुझे लगता है (बिना किसी तथ्यात्मक आधार के) कि यह सूची करने के लिए कहीं कहीं है; यह वास्तव में एक सवाल है कि अगर उस सूची में वास्तव में लागू होने के लिए पर्याप्त हो जाता है।

ही संभव परिवर्तन है कि मैं अपने स्वयं के गणनीय लौटने विधि में विधि के शीर्ष से अलग-अलग yield returns के सभी बाहर refactor करने के लिए किया जाएगा देख सकते हैं, और फिर एक नया तरीका है कि उस विधि और methodReturningEnumerable(x,y,z) के संयोजन रिटर्न जोड़ने । क्या यह बेहतर होगा; नहीं, शायद नहीं। Concat उतना ही उतना ही जोड़ देगा जितना आप बचाएंगे, अगर अधिक नहीं।

+1

मैं इसे स्वीकार किए गए उत्तर के रूप में चिह्नित नहीं कर रहा हूं क्योंकि यह मुझे वह उत्तर देता है जो मैं ढूंढ रहा था, लेकिन क्योंकि यह काफी अच्छा बताता है कि मैं जिस उत्तर को ढूंढ रहा हूं (अभी तक) मौजूद नहीं है। – rheone

2

नहीं किया जा सकता है। हालांकि यह बुरा नहीं है। आप एक ही लाइन के लिए इसे छोटा कर सकते हैं:

foreach (var o in otherEnumerator) yield return o; 

असंबंधित ध्यान दें: आप क्या तर्क है कि आप अपने जनरेटर में शामिल की सावधान रहना चाहिए; GetEnumerator() लौटाए गए IEnumerable पर सभी निष्पादन स्थगित कर दिया जाता है। मैं अपने आप को NullArgumentException गलत तरीके से फेंक रहा हूं, इसलिए मैंने सोचा कि यह उल्लेखनीय है। :)