2010-08-27 7 views
12

अभी इसे मौका से ढूंढें, IEnumerable<T> के बजाय ICollection<T> में जोड़ें (टी) परिभाषित किया गया है। और Enumerable.cs में एक्सटेंशन विधियों में जोड़ें (टी) नहीं है, जो मुझे लगता है कि वास्तव में अजीब है। चूंकि कोई ऑब्जेक्ट गिनती योग्य है, इसलिए इसे वस्तुओं का संग्रह "दिखाना" चाहिए। क्या कोई मुझे बता सकता है क्यों?क्यों नहीं Inumerable <T> लागू करें (टी) लागू करें?

+0

था' IEnumerable 'आवश्यक' Add' लागू किया जाना है, वहाँ हो जाएगा और अधिक सवाल अन्य तरीकों से: * 'IENumerable ' 'जोड़ें '* क्यों है। जिस तरह से यह है, बहुत उपयोगी है :) – nawfal

उत्तर

45

एक IEnumerable<T> तत्वों का केवल एक अनुक्रम है; इसे केवल एक आगे कर्सर के रूप में देखें। चूंकि उनमें से बहुत से अनुक्रम मूल्यों, डेटा की धाराओं, या डेटाबेस से रिकॉर्ड सेट उत्पन्न कर रहे हैं, इसलिए उन्हें Add आइटमों का कोई अर्थ नहीं है।

+9

शब्द * अनुक्रम * का उपयोग करने के लिए +1, क्योंकि आईनेमेरेबल बिल्कुल ठीक है, और कुछ प्रकार का संग्रह नहीं है। – OregonGhost

+5

क्या डाउनवॉटर बता सकते हैं कि वे क्यों कम हो गए? एक विकल्प, Concat सुझाव देने के लिए – Steven

11

IEnumerable पढ़ने के लिए नहीं, पढ़ने के लिए है।

2

जैसा कि इसका नाम कहता है, आप एक आईनेमरेबल पर गणना (लूप) कर सकते हैं, और यह इसके बारे में है। जब आप इसमें कुछ जोड़ना चाहते हैं, तो यह अब एक संख्यात्मक नहीं होगा, क्योंकि इसमें अतिरिक्त सुविधाएं हैं।

उदाहरण के लिए, एक सरणी एक आईनेमरेबल है, लेकिन एक सरणी की एक निश्चित लंबाई है, इसलिए आप इसमें नए आइटम नहीं जोड़ सकते हैं।

आईन्यूमेरेबल सभी प्रकार के संग्रहों के लिए केवल 'आधार' है (यहां तक ​​कि केवल पढ़ने के संग्रह - जो स्पष्ट रूप से कोई जोड़() विधि नहीं है)। अधिक कार्यक्षमता जो आप इस तरह के 'बेस इंटरफेस' में जोड़ना चाहते हैं, उतना ही विशिष्ट होगा।

10

एक गणनीय बिल्कुल सही है - कुछ आप समझा सकते हैं और सभी वस्तुओं को खोज सकते हैं। यह इस बात का तात्पर्य नहीं है कि आप इसमें जोड़ सकते हैं।

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

तकनीकी रूप से आप Concat<> का उपयोग करके, एक संख्यात्मक रूप से 'जोड़' सकते हैं - हालांकि यह सब एक गणनाकर्ता है जो एक समरूप से अगले तक समझाता है - एक एकल विरोधाभासी सेट के भ्रम को देता है।

+0

+1। – Emile

2

नाम यह सब कहता है। IENumerable केवल वस्तुओं की गणना के लिए है। आईसीओलेक्शन वस्तुओं का वास्तविक संग्रह है और इस प्रकार ऐड विधि का समर्थन करता है।

3

प्रत्येक ICollectionIEnumerable होना चाहिए (मुझे लगता है, और .NET Framework टीम मेरे साथ सहमत है ;-)), लेकिन दूसरी तरफ हमेशा समझ में नहीं आता है। इस दुनिया में "वस्तुओं की तरह संग्रह" का पदानुक्रम है, और आपकी धारणा है कि एक गणना करने वाला एक संग्रह होगा जो आप उस पदानुक्रम में सही नहीं होने के लिए आइटम जोड़ सकते हैं।

उदाहरण: प्राथमिक रंग नामों की एक सूची IEnumerable"Red", "Blue" और "Green" लौटाएगी। यह बिल्कुल भी कोई तार्किक समझ बनाने से 'संग्रह "इस तरह भरा पर एक primaryColors.Add("Bright Purple") करने में सक्षम हो रहे हैं:

...whatever... 
{ 
    ... 
    var primaryColors = EnumeratePrimaryColors(); 
    ... 
} 

private static IEnumerable<string> EnumeratePrimaryColors() { 
    yield return "Red"; 
    yield return "Blue"; 
    yield return "Green"; 
} 
+0

'आईकॉलेक्शन '' आईन्यूलेक्शबल' और 'आईसीओलेक्शन ' से प्राप्त होता है 'आईन्यूमेरेबल ' (जो 'आईनेमेरेबल' से प्राप्त होता है) से विरासत प्राप्त करता है। दूसरे शब्दों में आप सही हैं: प्रत्येक 'आईसीओलेक्शन' एक 'आईनेमरेबल' है। – Steven

+0

@ स्टीवन: मुझे पता है ... – peSHIr

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