आलसी मूल्यांकन / स्थगित निष्पादन
जब तक आप वास्तव में उस विशिष्ट परिणाम के लिए कॉल नहीं करते हैं तब तक "यील्ड रिटर्न" इट्रेटर ब्लॉक किसी भी कोड को निष्पादित नहीं करेगा । इसका मतलब यह है कि उन्हें एक साथ कुशलता से जंजीर भी बनाया जा सकता है। पॉप क्विज़: फ़ाइल पर निम्न कोड कितनी बार पुनरावृति करेगा?
var query = File.ReadLines(@"C:\MyFile.txt")
.Where(l => l.Contains("search text") )
.Select(l => int.Parse(l.SubString(5,8))
.Where(i => i > 10 );
int sum=0;
foreach (int value in query)
{
sum += value;
}
इसका उत्तर बिल्कुल एक है, और यह तब तक नहीं है जब तक कि वे foreach
लूप में नीचे नहीं आते हैं । भले ही मेरे पास तीन अलग लाइनक ऑपरेटर फ़ंक्शन हैं, फिर भी हम केवल एक बार फ़ाइल की सामग्री के माध्यम से लूप करते हैं।
इससे प्रदर्शन के अलावा अन्य लाभ हैं। उदाहरण के लिए, मैं एक लॉग फ़ाइल को एक बार पढ़ने और पूर्व फ़िल्टर करने के लिए एक सरल और सामान्य विधि लिख सकता हूं , और कई अलग-अलग जगहों पर उसी पद्धति का उपयोग कर सकता हूं , जहां प्रत्येक उपयोग अलग-अलग फिल्टर पर जोड़ता है। इस प्रकार, मैं अच्छे प्रदर्शन को बनाए रखता हूं जबकि कोड का कुशलतापूर्वक पुन: उपयोग भी करता हूं।
अनंत सूचियाँ
एक अच्छे उदाहरण के लिए इस सवाल का मेरा जवाब देखें:
C # रिटायरमेंट फंक्शन रिटर्निंग एरर
मूल रूप से, मैं एक इट्रेटर ब्लॉक का उपयोग करके रिट्रेसमेंट अनुक्रम को लागू करता हूं जो कभी भी बंद नहीं होगा (कम से कम, मैक्सिमेंट तक पहुंचने से पहले नहीं), और फिर उस कार्यान्वयन को सुरक्षित तरीके से उपयोग करें।
बेहतर शब्दार्थ और चिंताओं को अलग करना
ऊपर से फ़ाइल उदाहरण का उपयोग करने के बाद, हम अब उस कोड से आसानी से अलग हो सकते हैं जो उस कोड से फ़ाइल को पढ़ता है जो उस कोड से अन-जरूरी लाइनों को फ़िल्टर करता है जो वास्तव में परिणामों को पार्स करता है। यह पहला, विशेष रूप से, बहुत पुन: प्रयोज्य है।
यह उन चीजों बहुत कठिन है कि गद्य से समझाने के लिए में से एक है की तुलना में यह है के साथ बस जो एक साधारण दृश्य 1 :
यदि आप छवि नहीं देख सकते हैं, तो यह एक ही कोड के दो संस्करणों को दिखाता है, विभिन्न चिंताओं के लिए पृष्ठभूमि पर प्रकाश डाला गया है। Linq कोड में सभी रंगों को अच्छी तरह से समूहीकृत किया गया है, जबकि पारंपरिक अनिवार्यता कोड में रंगों का परस्पर संबंध है। लेखक का तर्क है (और मैं सहमत हूं) कि यह परिणाम linq बनाम अनिवार्य कोड का उपयोग करने के लिए विशिष्ट है ... यह कि linq आपके कोड को व्यवस्थित करने के लिए एक बेहतर काम करता है जो वर्गों के बीच एक बेहतर प्रवाह है।
1 मेरा मानना है कि यह मूल स्रोत है: https://twitter.com/mariofusco/status/57199921603939272784 । यह भी ध्यान दें कि यह कोड जावा है, लेकिन C # समान होगा।