2010-09-22 22 views
9

का उपयोग कैसे कर सकता हूं, मैं एक वीबी.Net डेवलपर हूं, सी #, में नौसिखिया की तरह सी # दस्तावेज में देखकर मैं इटरेटर और जेनरेटर के माध्यम से आया, उपयोग को पूरी तरह समझ नहीं पाया, मैं वहां कोई भी जो व्याख्या कर सकता हूं (vb perceptive; यदि संभव हो)सी # इटरेटर और जेनरेटर क्या हैं, और मैं उन्हें

+1

Iterators का उपयोग अक्सर विभिन्न प्रकार की सूचियों को पार करने के लिए किया जाता है। Iterators को .NET में Enumerators कहा जाता है। Iterators के बारे में एक और सवाल: http://stackoverflow.com/questions/1227283/why-do-we-need-iterators-in-c – jgauffin

उत्तर

14

इटरेटर IEnumerable<T>/IEnumerator<T> स्वयं को लागू किए बिना आइटमों का अनुक्रम उत्पन्न करने का एक आसान तरीका है। एक इटरेटर एक तरीका है जो IEnumerable<T> देता है जिसे आप फ़ोरैच लूप में गणना कर सकते हैं।

यहाँ एक सरल उदाहरण है:

public IEnumerable<string> GetNames() 
{ 
    yield return "Joe"; 
    yield return "Jack"; 
    yield return "Jane"; 
} 

foreach(string name in GetNames()) 
{ 
    Console.WriteLine(name); 
} 

सूचना yield return बयान: इन बयान वास्तव में विधि, वे तो बस "पुश" जो कोई भी कार्यान्वयन पढ़ रही है करने के लिए अगले तत्व से नहीं लौटाते हैं।

जब संकलक एक इटरेटर ब्लॉक से मुकाबला करता है, तो यह वास्तव में उस वर्ग में एक राज्य मशीन को फिर से लिखता है जो IEnumerable<T> और IEnumerator<T> लागू करता है। इटरेटर में प्रत्येक yield return कथन उस राज्य मशीन के किसी राज्य से मेल खाता है।

यूट स्काईट द्वारा this article को यूजर स्कीट द्वारा अधिक जानकारी के लिए देखें।

+0

यह एक उदाहरण देखने में मददगार होगा जब आपको ऐसा करने की आवश्यकता हो सकती है। यदि आपका लक्ष्य सिर्फ "जो" "जैक" और "जेन" पर गणना की अनुमति देने के लिए है, तो आपका सरल उदाहरण केवल तारों की सरणी के साथ प्रतिस्थापित किया जा सकता है? – MarkJ

+0

हां, यह उदाहरण बहुत उपयोगी नहीं है, आप इसके बजाय आसानी से सरणी का उपयोग कर सकते हैं। अधिक उपयोगी उदाहरणों के लिए, [लिंक को ऑब्जेक्ट्स को पुन: कार्यान्वित करने पर जॉन स्कीट की श्रृंखला] देखें (http://msmvps.com/blogs/jon_skeet/archive/tags/Edulinq/default.aspx);) –