2009-09-25 14 views
20

दोनों दृष्टिकोणों के फायदे/दोष क्या हैं?उपज रिटर्न बनाम रिटर्न का चयन करें

return items.Select(item => DoSomething(item)); 

बनाम

foreach(var item in items) 
{ 
    yield return DoSomething(item); 
} 

संपादित के रूप में वे MSIL लगभग बराबर हैं, जो एक आप अधिक पठनीय पाते हैं?

+11

आपका दूसरा कोड खंड * चयन का * कार्यान्वयन * है। (मान लीजिए कि LINQ ऑब्जेक्ट्स है।) यह सब कुछ है - यह एक फोरच लूप चलाता है, प्रत्येक आइटम पर प्रतिनिधि चलाता है, और परिणाम देता है। –

+0

हां। लेकिन पहले और दूसरे टाइप करते समय अभी भी अंतर है। पहला अंतर: एलओसी की संख्या, दूसरा अंतर: पठनीयता, तीसरा अंतर: जब उपज रिटर्न एक विधि में मौजूद होता है, तो कुछ प्रतिबंध लागू होते हैं (यानी: आप एक ही विधि में उपज वापसी के बाद वापसी का चयन नहीं कर सकते हैं)। –

उत्तर

17

yield return तकनीक सी # कंपाइलर को "दृश्यों के पीछे" एक गणक वर्ग उत्पन्न करने का कारण बनती है, जबकि Select कॉल एक प्रतिनिधि के साथ पैरामीटरकृत मानक एन्यूमेरेटर क्लास का उपयोग करता है। व्यावहारिक रूप से, प्रतिनिधियों के लिए Select मामले में संभावित कॉल फ्रेम के अलावा, दोनों के बीच एक बहुत अंतर नहीं होना चाहिए।

इसके लायक होने के लिए, DoSomething के आसपास एक लैम्ब्डा लपेटना भी व्यर्थ है; बस इसके लिए एक प्रतिनिधि को सीधे पास करें।

+1

इस मामले में लैम्ब्डा के विरोध में एक प्रतिनिधि को पारित करने से क्या अलग होने जा रहा है? –

+9

वापसी आइटम। चयन करें (कुछ करो); –

+0

आह, इस तरह, उस बारे में नहीं सोचा था। –

3

केवल आपको अपने "आइटम" संग्रह में प्रत्येक आइटम के लिए एक ऑब्जेक्ट वापस करने की अनुमति देता है। अतिरिक्त .Where(x => DoIReallyWantThis(x)) का उपयोग करके आप अवांछित वस्तुओं को बाहर निकालने की अनुमति देते हैं, लेकिन फिर भी आपको प्रति आइटम एक ऑब्जेक्ट वापस करने की अनुमति देता है। यदि आप संभावित रूप से प्रति आइटम एक से अधिक ऑब्जेक्ट चाहते हैं, तो आप .SelectMany का उपयोग कर सकते हैं, लेकिन पढ़ने के लिए आसान से कम एक लंबी लाइन के साथ हवा में जाना आसान है।

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

9

धीमी गति से चलने वाली कॉर्पोरेट दुनिया में जहां मैं वर्तमान में मेरी इच्छा से अधिक समय बिताता हूं, उपज रिटर्न में भारी लाभ होता है कि उसे उस ब्रांड के नए .NET 3.5 फ्रेमवर्क की आवश्यकता नहीं है जो कि इसके लिए स्थापित नहीं होगा कम से कम 2 साल।

+0

कूल जवाब। लेकिन .NET Framework 3.5 जल्द ही अपडेट किया जा रहा है (4.0)। –

+10

".NET Framework 3.5 जल्द ही अपडेट किया जा रहा है" - जहां मैं काम नहीं करता हूं :( – Joe

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