2011-04-03 9 views
7

इस तरह के अस्पष्ट प्रश्न के लिए खेद है, लेकिन मैं एक दिन के सबसे अच्छे भाग के लिए चारों ओर खोज रहा हूं, मैंने आलेख के बाद आलेख पढ़ा है (और यहां कई प्रश्न हैं) लेकिन उत्तर को समझने में आसानी नहीं मिल सकती है।गैर-जेनेरिक आईनेमेरेबल और जेनेरिक आईनेमेरेबल <T> के बीच क्या अंतर है?

मैं (लगता है कि मैं) पता है कि IEnumerable के लिए है, लेकिन मैं अभी नहीं समझ सकता कि इसका क्या मतलब है जब यह एक सामान्य प्रकार तर्क के साथ परिभाषित किया गया है, उदाहरण के लिए:

IEnumerable<int> test = method(); 

यह सिर्फ मुझे गाड़ी चला रहा है पागल! कृपया मुझे दुःख से दूर रखें और इसका अर्थ बताएं कि इसका क्या अर्थ है?

उत्तर

13

एक IEnumerable के रूप में इस्तेमाल किया जा सकता मूल रूप से वस्तुओं का संग्रह है। इसमें विधि GetEnumerator() है जो आपको समझा जा सकने वाली सभी वस्तुओं के माध्यम से पुन: सक्रिय करने की अनुमति देती है।

एक IEnumerable<int> मूल रूप से पूर्णांक का संग्रह है। इसमें विधि GetEnumerator() है जो आपको समेकित में सभी पूर्णांकों के माध्यम से पुन: सक्रिय करने की अनुमति देती है।

IEnumerable<int> test = method(); का अर्थ है कि method() कहीं से पूर्णांक होने पर संग्रह प्राप्त हो रहा है। यह एक सूची, एक सरणी या कुछ अन्य डेटा प्रकार हो सकता है, लेकिन यह निश्चित रूप से उनमें से एक समूह है और वे सभी पूर्णांक हैं, और आपके पास उनके माध्यम से पुन: प्रयास करने की क्षमता है।

इस पोस्ट में मददगार के रूप में अच्छी तरह से हो सकता है: What's the difference between IEnumerable and Array, IList and List?

+0

के बीच subtleties को समझने के लिए आगे बढ़ सकता है ठीक है, मुझे लगता है कि अब मैं समझता हूं, मुझे नहीं पता था कि यह एक संग्रह हो सकता है और मुझे अभी समझ में नहीं आया कि यह कैसे काम करता है। क्या कोई अच्छा संसाधन है जो आप दिखा सकते हैं जो IENumerable/list/arrays की तुलना में लाभ/नुकसान दिखाता है क्योंकि मैं वास्तव में और जानना चाहता हूं। +1 (जब मैं कर सकता हूं!) – idiot

+0

सूचियां और सरणी दोनों 'IENumerable' को लागू करते हैं। 'System.Collections.Generic' में सभी जेनेरिक संग्रह 'IENumerable 'लागू करें। इस पोस्ट में रुचि हो सकती: http://stackoverflow.com/questions/764748/whats-the-difference-between-ienumerable-and-array-ilist-and-list – smartcaveman

+0

धन्यवाद ... और जवाब के रूप में अंकन .. आप उस लिंक को अपने मुख्य उत्तर में भी संपादित/संपादित करना चाह सकते हैं क्योंकि वास्तव में मुझे अब पूरी तरह से समझ में आया है। – idiot

2

मैं बस IEnumerable<int> के बारे में सोचता हूं जैसा कि मैं List<int> के बारे में सोचता हूं, जो मुझे लगता है कि थोड़ा और स्वाभाविक रूप से लगता है। चेतावनी के साथ एक IEnumerable<int> एक List<int> के रूप में काफी के रूप में ज्यादा है कि नहीं करता है और कि अनिवार्य रूप से यह ints की बस एक बात कि

+2

मुझे वास्तव में यह समानता पसंद नहीं है। एक सूची मानती है कि सभी आइटम एक ही स्थान पर हैं। जहां 'आईन्यूमेरेबल' के रूप में कहता है कि आप कुछ अनुक्रमों में सभी आइटम प्राप्त कर सकते हैं। यह एक फोन बुक और इंटरनेट के बीच अंतर की तरह है। मैं किसी भी स्थान से शिकागो में प्लंबर के लिए सभी नंबर प्राप्त कर सकता हूं, लेकिन फोन बुक में, वे पहले से ही एक सूची में हैं - जबकि 'आईन्यूमेरेबल' या इंटरनेट पर, वे कुछ भी हो सकते हैं, मुझे बस यह जानने की जरूरत है कि कैसे उन्हें ढूंढें - मैंने आपको कम नहीं किया है, मुझे लगता है कि आपका जवाब थोड़ा और स्पष्टता का उपयोग कर सकता है। – smartcaveman

+0

user689466 IENumerable को समझने का एक तरीका ढूंढ रहा है। स्पष्ट रूप से मतभेद हैं - यह एक आसानी से समझने योग्य अवधारणा के साथ एक शुरुआती बिंदु है और एक बार जब वह groks कि वह दो – kenwarner

0

शब्द आप कि "जेनरिक" के लिए देख रहे प्रगणित किया जा सकता है, और उदाहरण आप देते हैं INumerable प्रकार int के प्रकार के लिए जेनेरिक के रूप में उपयोग किया जा रहा है। इसका अर्थ यह है कि आपके द्वारा उपयोग किए जा रहे IENumerable संग्रह को किसी अन्य प्रकार के विपरीत केवल int ऑब्जेक्ट्स रखने के लिए दृढ़ता से टाइप किया गया है।

Google "सी # जेनेरिक आईन्यूमेरेबल" और आपको वह सारी जानकारी मिल जाएगी जो आप चाहते हैं।

0

आईनेमेरेबल का अर्थ है कि इसे फ़ोरैच लूप में उपयोग किया जा सकता है।

test

foreach(int item : test) 
{ 
    console.writeline(item); 
} 
2

एक IEnumerable एक GetEnumerator विधि है जो एक IEnumerator, जिसका Current विधि एक Object वापस आ जाएगी वापस आ जाएगी है। एक IEnumerable<T> में GetEnumerator विधि है जो IEnumerator<T> लौटाएगी, जिसका Current विधि T लौटाएगी। यदि आप पहले से जानते हैं कि वस्तु के अपेक्षित प्रकार को गणनाकर्ता द्वारा वापस किया जाना है, तो सामान्य रूप से सामान्य रूप का उपयोग करना बेहतर होता है।

एक और अंतर यह है कि IEnumerator<T> विरासत IDisposable, जो जो एक प्रगणक यह समर्थित है या नहीं के बारे में चिंता किए बिना उस पर Dispose कॉल करने के लिए साथ किया जाता है कोड की अनुमति देता है। तुलनात्मक रूप से, गैर-जेनेरिक IEnumerator का उपयोग करते समय, यह जांचना आवश्यक है कि यह IDisposable है और यदि ऐसा है तो Dispose पर कॉल करें।ध्यान दें कि IEnumerable/IEnumerator के गैर-जेनेरिक रूप का उपयोग Dispose पर कॉल करने की आवश्यकता से कोई राहत नहीं देता है। उदाहरण के तौर पर, वीबी-स्टाइल संग्रह को IEnumerable पर कास्टिंग करें और फिर GetEnumerator को कॉल करके Dispose कॉल किए बिना 100,000 बार कॉल करना बेहद धीमा हो जाएगा (कई सेकंड, यहां तक ​​कि i7 पर भी) जब तक कचरा-संग्रह नहीं होता है। प्रत्येक कॉल के बाद IEnumerator का निपटान करने से सौ गुना अधिक चीजें बढ़ जाएंगी।

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