2009-03-06 11 views

उत्तर

90

IEnumerable एक अंतरफलक है कि एक विधि GetEnumerator जो एक IEnumerator इंटरफ़ेस देता है परिभाषित करता है, यह बारी में एक संग्रह करने के लिए पढ़ने के लिए पहुंच की अनुमति देता है। एक संग्रह जो IENumerable लागू करता है उसे फ़ोरैच स्टेटमेंट के साथ उपयोग किया जा सकता है।

परिभाषा

IEnumerable 

public IEnumerator GetEnumerator(); 

IEnumerator 

public object Current; 
public void Reset(); 
public bool MoveNext(); 

example code from codebetter.com

+3

@Rex एम: मुझे लगता है कि कोड समझ में आता है। IENumerable में एक विधि GetEnumerator है जो आईन्यूमेर * एटोर * देता है, न कि IENumer * सक्षम *। – Lernkurve

+5

@Lernkurve उत्तर को मेरी टिप्पणी पोस्ट करने के बाद सही होने के लिए संशोधित किया गया था। –

6

IENumerable और IENumerator दोनों इंटरफ़ेस हैं। IENumerable में GetEnumerator नामक एक विधि है। यह विधि retuns (जैसा कि सभी विधियों शून्य सहित कुछ वापस लौटाते हैं) एक और प्रकार जो एक इंटरफ़ेस है और वह इंटरफ़ेस IENumerator है। जब आप अपनी किसी भी संग्रह कक्षा में गणक तर्क लागू करते हैं, तो आप IENumerable (या तो सामान्य या गैर सामान्य) लागू करते हैं। IENumerable में केवल एक विधि है जबकि आईनेमेरेटर में 2 विधियां हैं (MoveNext और रीसेट) और एक प्रॉपर्टी वर्तमान। आसान समझ के लिए आईन्यूमेबल को एक बॉक्स पर विचार करें जिसमें इसके अंदर आईएन्यूमेरेटर शामिल है (हालांकि विरासत या रोकथाम के माध्यम से नहीं)। बेहतर समझ के लिए कोड देखें:

class Test : IEnumerable, IEnumerator 
    { 
     IEnumerator IEnumerable.GetEnumerator() 
     { 
      throw new NotImplementedException(); 
     } 

     public object Current 
     { 
      get { throw new NotImplementedException(); } 
     } 

     public bool MoveNext() 
     { 
      throw new NotImplementedException(); 
     } 
     public void Reset() 
     { 
      throw new NotImplementedException(); 
     } 
    } 
58

एक IEnumerator एक बात यह है कि गणना कर सकते हैं: यह Current संपत्ति और MoveNext और Reset तरीकों (जो .NET कोड में आप शायद स्पष्ट रूप से फोन नहीं होगा , हालांकि आप कर सकते थे)।

एक IEnumerable एक ऐसी चीज है जिसे समझाया जा सकता है ... जिसका अर्थ यह है कि इसमें GetEnumerator विधि है जो IEnumerator देता है।

आप किस का उपयोग करते हैं? IEnumerator का उपयोग करने का एकमात्र कारण यह है कि यदि आपके पास ऐसा कुछ है जिसमें गणना करने का एक गैर-मानक तरीका है (यानी, अपने विभिन्न तत्वों को एक-एक करके लौटने का), और आपको यह परिभाषित करने की आवश्यकता है कि यह कैसे काम करता है। आप IEnumerator को लागू करने वाली एक नई कक्षा तैयार करेंगे। लेकिन आपको अभी भी IEnumerator को IEnumerable कक्षा में वापस करने की आवश्यकता होगी।

क्या एक प्रगणक (लागू करने IEnumerator<T>) की तरह दिखता है, इस तरह के List<T>, Queue<T>, या Stack<T> में निहित लोगों के रूप में, किसी भी Enumerator<T> वर्ग को देखने पर एक नज़र के लिए। IEnumerable को लागू करने वाली कक्षा को देखने के लिए, किसी भी मानक संग्रह वर्ग को देखें।

13

एक Enumerator आपको एक सूची या संग्रह में आइटम दिखाता है। एक गणक का प्रत्येक उदाहरण एक निश्चित स्थिति (पहला तत्व, 7 वां तत्व, आदि) पर है और आपको वह तत्व (IEnumerator.Current) दे सकता है या अगले (IEnumerator.MoveNext) पर जा सकता है। जब आप C# में foreach लूप लिखते हैं, तो संकलक कोड उत्पन्न करता है जो एक गणनाकर्ता का उपयोग करता है।

एक Enumerable एक कक्षा है जो आपको Enumerator एस दे सकती है।इसमें GetEnumerator नामक एक विधि है जो आपको Enumerator देता है जो इसकी वस्तुओं को देखती है। जब आप foreach लूप को सी # में लिखते हैं, तो वह कोड जो GetEnumerator को लूप द्वारा उपयोग किए गए Enumerator को बनाने के लिए कॉल करता है।

+1

वह ब्लॉग पोस्ट बल्कि गलत है। – SLaks

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