दक्षता
yield
कीवर्ड प्रभावी रूप से संग्रह से अधिक आइटम एक आलसी गणन कि और अधिक कुशल हो सकता है बनाता है। उदाहरण के लिए, यदि आपका foreach
लूप 1 मिलियन आइटम के सिर्फ पहले 5 आइटम से अधिक है, तो यह सभी yield
रिटर्न है, और आपने आंतरिक रूप से 1 मिलियन आइटम का संग्रह पहले नहीं बनाया है। इसी तरह आप उन्हीं कार्यकुशलताओं को प्राप्त करने के लिए अपने प्रोग्रामिंग परिदृश्यों में रिटर्न वैल्यू के yield
साथ उपयोग करना चाहेंगे IEnumerable<T>
।
एक निश्चित परिदृश्य में प्राप्त दक्षता का उदाहरण
एक पुनरावृत्ति विधि नहीं, एक बड़े संग्रह का संभावित अयोग्य उपयोग,
(मध्यवर्ती संग्रह में बहुत सारे आइटम बनाए गए हैं)
// Method returns all million items before anything can loop over them.
List<object> GetAllItems() {
List<object> millionCustomers;
database.LoadMillionCustomerRecords(millionCustomers);
return millionCustomers;
}
// MAIN example ---------------------
// Caller code sample:
int num = 0;
foreach(var itm in GetAllItems()) {
num++;
if (num == 5)
break;
}
// Note: One million items returned, but only 5 used.
Iterator संस्करण, कुशल
(कोई मध्यवर्ती संग्रह नहीं बनाया गया है)
// Yields items one at a time as the caller's foreach loop requests them
IEnumerable<object> IterateOverItems() {
for (int i; i < database.Customers.Count(); ++i)
yield return database.Customers[i];
}
// MAIN example ---------------------
// Caller code sample:
int num = 0;
foreach(var itm in IterateOverItems()) {
num++;
if (num == 5)
break;
}
// Note: Only 5 items were yielded and used out of the million.
कुछ प्रोग्रामिंग परिदृश्यों को सरल बनाएं
एक अन्य मामले में, यह कुछ प्रकार की सूचियों को क्रमबद्ध करना और सूचीबद्ध करना आसान बनाता है क्योंकि आप सिर्फ yield
एक मध्यवर्ती संग्रह में उन्हें छांटने और उन्हें वहां स्वैप करने के बजाय वांछित क्रम में वापस करते हैं। ऐसे कई परिदृश्य हैं।
बस एक उदाहरण दो सूचियों का विलय है:
IEnumerable<object> EfficientMerge(List<object> list1, List<object> list2) {
foreach(var o in list1)
yield return o;
foreach(var o in list2)
yield return o;
}
यह विधि आइटमों की एक सन्निहित सूची को वापस लाती है, प्रभावी रूप से कोई मध्यवर्ती संग्रह की आवश्यकता के साथ एक मर्ज।
और जानकारी
yield
कीवर्ड केवल पुनरावर्तक विधि के संदर्भ में इस्तेमाल किया जा सकता (का एक वापसी प्रकार के होने IEnumerable
, IEnumerator
, IEnumerable<T>
, या IEnumerator<T>
।) और वहाँ के साथ विशेष संबंध है foreach
। Iterators विशेष तरीके हैं। MSDN उपज प्रलेखन और इटरेटर प्रलेखन रोचक जानकारी और अवधारणाओं की व्याख्या के बहुत सारे हैं। इसके साथ सहसंबंधी के लिए सुनिश्चित करें कीवर्ड इसके बारे में बहुत पढ़ने, iterators की अपनी समझ के पूरक के लिए द्वारा।foreach
यह जानने के लिए कि पुनरावृत्तियां अपनी दक्षता कैसे प्राप्त करती हैं, सीएल # संकलक द्वारा उत्पन्न आईएल कोड में रहस्य है। एक पुनरावृत्त विधि के लिए उत्पन्न IL एक नियमित (गैर-पुनरावृत्ति) विधि के लिए उत्पन्न द्रव्यमान से काफी भिन्न होता है। यह लेख (क्या यील्ड कीवर्ड वास्तव में उत्पन्न करता है ?) उस तरह की अंतर्दृष्टि प्रदान करता है।