जब मैं IEnumerable<T>
इंटरफ़ेस को अनुकरण करता हूं तो मुझे दो GetEnumerator
विधियां दिखाई देती हैं: एक xxx4 और अन्य IEnumerator<T>
लौटाता है। मैं एक या दूसरे का उपयोग कब करूंगा?IENumerable <T> दो GetEnumerator विधियों को प्रदान करता है - उनके बीच क्या अंतर है?
उत्तर
आप IEnumerable<T>
सामान्य इंटरफ़ेस कार्यान्वित कर रहे हैं, तो आप काफी हमेशा सामान्य GetEnumerator विधि का उपयोग करना होगा - जब तक आप (गैर सामान्य) IEnumerable स्पष्ट रूप से अपने वस्तु डाली।
कारण .NET 1.0/1.1 के साथ पिछड़ा संगतता है जो जेनेरिक का समर्थन नहीं करता है।
एक सामान्य है, दूसरा नहीं। मेरा मानना है कि संकलक जेनेरिक अधिभार का उपयोग करना पसंद करता है।
आमतौर पर GetEnumerator()
GetEnumerator<T>()
कहता है, तो वहाँ व्यवहार में ज्यादा अंतर नहीं होना चाहिए। क्यों दो विधियां हैं, यह पिछली संगतता के लिए और स्थिति में उपयोग के लिए किया जाता है जहां T
बहुत रुचि नहीं है (या केवल अज्ञात है)।
कारण वहाँ दो तरीके हैं क्योंकि IEnumerable<T>
IEnumerable
इंटरफ़ेस ताकि आप IEnumerable<T>
से सामान्य विधि और IEnumerable
से गैर सामान्य विधि को देख रहे हैं विरासत है।
class Foo : IEnumerable<Foo>
{
public IEnumerator<Foo> GetEnumerator()
{
// do your thing here
}
// do a EIMI here and simply call the generic method
IEnumerator IEnumerable.GetEnumerator()
{
this.GetEnumerator();
}
}
आप आम तौर पर दोनों को लागू:
यहां अपने प्रकार में इंटरफ़ेस को लागू करना चाहते हैं। एक नया, जेनेरिक संस्करण है जो टाइपएफ़ एन्युमेरेटर (IEnumerator<T>
) देता है। दूसरा एक विरासत कोड के साथ संगतता के लिए है (IEnumerator
देता है)। एक ठेठ दिया गया है:
public IEnumerator<T> GetEnumerator() {
foreach(T item in items) {
yield return item;
}
}
IEnumerator IEnumerable.GetEnumerator() {
return GetEnumerator();
}
इसने ने मुझे बहुत मदद की, नेस्टेड गणक के लिए अतिरिक्त श्रेणी से परहेज किया! –
+1। मैं एक संदर्भ कार्यान्वयन खोजने के लिए भी गुगल रहा था जो नेस्टेड एन्यूमेरेटर क्लास से बचाता है और यह पहला जवाब था जो मैं आया था। –
- 1. IEnumerable.GetEnumerator() और IEnumerable <T> .GetEnumerator()
- 2. क्या आईनेमेरेबल <T> और आईनेमेरेटर <T> लौटने वाले इटरेटर विधियों के बीच कोई अंतर है?
- 3. os.popen() विधियों के बीच क्या अंतर है?
- 4. 'IList <T>' को कार्यान्वित करने के लिए दो 'GetEnumerator' विधियों को परिभाषित करने की आवश्यकता क्यों है?
- 5. नियंत्रण संग्रह सभी IENumerable विधियों को क्यों प्रदान नहीं करता है?
- 6. IENumerable <T> IENumerable से क्यों प्राप्त होता है?
- 7. Html.Partial और Html.Action विधियों के बीच क्या अंतर है?
- 8. SQLite उनके कोड के समामेलन क्यों प्रदान करता है?
- 9. क्या IENumerable <TSource> Concat <TSource> तत्वों के क्रम को संरक्षित करता है?
- 10. IENumerable <T>
- 11. आईनेमेरेबल और आईनेमेरेबल <T> के बीच अंतर?
- 12. System.Linq.Enumerable.WhereListIterator & System.Linq.Enumerable.WhereSelectListIterator के बीच क्या अंतर है?
- 13. <% # और <% = उद्घाटन टैग के बीच क्या अंतर है?
- 14. जावा: क्या क्या पर्यवेक्षकों ArrayList आरंभ के इन दो विधियों के बीच अंतर है निर्माण
- 15. क्यों जावा क्यू से तत्व को हटाने के लिए दो विधियों प्रदान करता है?
- 16. <%# %> और <%= %> के बीच क्या अंतर है?
- 17. दो एसक्यूएल में शामिल होने के बीच क्या अंतर है?
- 18. KineticJS ड्रा विधियों के बीच क्या अंतर है?
- 19. 5 जादुई रिकॉर्ड सेटअप विधियों के बीच क्या अंतर है?
- 20. आर में `=` और `<-` के बीच क्या अंतर है?
- 21. foreach कॉल GetEnumerator() कैसे कॉल करता है? IENumerable संदर्भ के माध्यम से या ... के माध्यम से?
- 22. ICollection <T> क्यों लागू करता है दोनों IEnumerable <T> और IEnumerable
- 23. क्या IENumerator.GetEnumerator() में IENumerator <T> .GetEnumerator() को वापस करना ठीक है?
- 24. क्या पृष्ठभूमिवर्कर वास्तविक मल्टीथ्रेडिंग प्रदान करता है?
- 25. GetEnumerator() के साथ IENumerable <T> को कैसे कार्यान्वित करें?
- 26. सूची <string> और आईनेमेरेबल <String> के बीच क्या अंतर है?
- 27. इन दो सी ++ कोड ब्लॉक के बीच क्या अंतर है?
- 28. जावा: <init> और <clinit> के बीच क्या अंतर है?
- 29. "<>" और "! =" के बीच क्या अंतर है?
- 30. इन दो फ़ंक्शन प्रकार परिभाषाओं के बीच क्या अंतर है?
+1 - ईआईएमआई = स्पष्ट इंटरफ़ेस सदस्य कार्यान्वयन –
लेकिन पृथ्वी पर कैसे 'Foo: IEnumerable' समझ में आता है? –
nawfal