C # में विभिन्न संग्रह जेनेरिक इंटरफेस के बीच अंतर


11

मैं पिछले कुछ समय से विंडोज और ASP.net MVC के विकास के लिए C # के साथ खेल रहा हूं। लेकिन मैं अभी भी कुछ क्षेत्रों पर स्पष्ट नहीं हूं। मैं जेनेरिक कलेक्शन इंटरफेसेस के समान प्रकार का उपयोग और इंटरचेंजिंग के साथ और प्रदर्शन के मुद्दों के बीच बुनियादी अंतर को समझने की कोशिश कर रहा हूं ।

बीच मूल अंतर क्या है IEnumerable<T>, ICollection<T>, List<T>(Class)?

मैं अपने अनुप्रयोगों में किसी भी समस्या को देखे बिना उनका उपयोग और इंटरचेंज कर रहा हूं। इसके अलावा, क्या इस तरह के और भी समान सामान्य संग्रह हैं जिन्हें उन तीनों के साथ जोड़ा जा सकता है?


2
वहाँ भी है IList <T> साथ ही
jk।

जवाबों:


19

सूची <T> एक वर्ग है और दोनों ICollection <T> और IEnumerable <T> इंटरफेस को लागू करता है। इसके अलावा, ICollection <T> IEnumerable <T> इंटरफ़ेस का विस्तार करता है। वे विनिमेय नहीं हैं, कम से कम सभी दृष्टिकोणों से नहीं।

यदि आपके पास एक सूची <T> है, तो आपको गारंटी दी जाती है कि यह ऑब्जेक्ट ICOLlection <T> और IEnumerable <T> इंटरफ़ेस द्वारा कार्यान्वित करने के लिए आवश्यक विधियों और गुणों को लागू करता है। संकलक यह जानता है और आपको उन्हें "डाउन" या तो एक ICollection <T> या एक IEnumerable <T> अंतर्निहित रूप से डालने की अनुमति है। हालाँकि, यदि आपके पास एक ICollection <T> है, तो आपको अपने कोड में पहले स्पष्ट रूप से जांचना होगा कि क्या यह सूची <T> है या कुछ और, शायद एक शब्दकोश <T> (जहाँ T यह एक KeyValuePair है ) आपको इसे डालने से पहले। मंशा।

आप जानते हैं कि ICollection IEnumerable का विस्तार करता है, इसलिए आप इसे IEnumerable में डाल सकते हैं। लेकिन अगर आपके पास केवल IEnumerable है, तो फिर से आपको गारंटी नहीं दी जाती है कि यह एक सूची है। यह हो सकता है, लेकिन यह कुछ और हो सकता है। यदि आप उदाहरण के लिए <T> को एक शब्दकोश <T> में डालने का प्रयास करते हैं, तो आपको एक अमान्य कास्ट अपवाद की अपेक्षा करनी चाहिए।

इसलिए वे "विनिमेय" नहीं हैं।

इसके अलावा, बहुत सारे सामान्य इंटरफ़ेस हैं, यह देखें कि आप System.Collections.Generic नाम में क्या पा सकते हैं ।

संपादित करें: आपकी टिप्पणी के बारे में, यदि आप सूची <T> का उपयोग करते हैं या इसे लागू करने वाले इंटरफ़ेस में से कोई एक प्रदर्शन जुर्माना है। फिर भी आपको एक नई वस्तु बनाने की आवश्यकता होगी, निम्नलिखित कोड देखें:

List<T> list = new List<T>();
ICollection<T> myColl = list;
IEnumerable<T> myEnum = list;

सूची , myColl , और myEnum सभी एक ही वस्तु को इंगित करते हैं। चाहे आप इसे एक सूची के रूप में घोषित करें या एक ICollection या IEnumerable मैं अभी भी सूची बनाने के लिए कार्यक्रम की आवश्यकता कर रहा हूं। मैं यह लिख सकता था:

ICollection<T> myColl = new List<T>();

myColl , रनटाइम पर अभी भी एक सूची है।

हालांकि , यह एक सबसे महत्वपूर्ण बिंदु है ... युग्मन को कम करने और बनाए रखने की क्षमता को बढ़ाने के लिए आपको हमेशा अपने चर और विधि मापदंडों की घोषणा करना चाहिए ताकि आपके लिए सबसे कम संभव भाजक का उपयोग किया जा सके, चाहे वह एक इंटरफ़ेस या एक सार या ठोस वर्ग हो।

कल्पना करें कि "परफॉर्मेपरेशन" विधि की एकमात्र जरूरत तत्वों की गणना करना है, कुछ काम और निकास करना है, उस स्थिति में आपको सूची <T> में उपलब्ध सौ अधिक विधियों की आवश्यकता नहीं है, आपको केवल IEnumerer <T में उपलब्ध है। >, इसलिए निम्नलिखित आवेदन करना चाहिए:

public void PerformOperation(IEnumerable<T> myEnumeration) { ... }

ऐसा करने से, आप और अन्य डेवलपर्स जानते हैं कि IEnumerable <T> इंटरफ़ेस को लागू करने वाले किसी भी वर्ग की कोई भी वस्तु इस पद्धति को दी जा सकती है। यह एक सूची, एक शब्दकोश या एक कस्टम संग्रह वर्ग हो सकता है जो किसी अन्य डेवलपर ने लिखा हो।

यदि इसके विपरीत आप स्पष्ट रूप से एक ठोस सूची की आवश्यकता है <T> (और यद्यपि यह वास्तविक जीवन में शायद ही कभी ऐसा होता है, तो भी हो सकता है), आप और अन्य डेवलपर्स जानते हैं कि या तो यह एक सूची होनी चाहिए या कोई अन्य ठोस वर्ग विरासत में मिला है सूची से।


सबसे पहले धन्यवाद। अब, चिंता का विषय यह है कि कैसे निर्णय लिया जाए कि किसका उपयोग किया जाए ??। चूंकि सूची <टी> दोनों इंटरफेस को लागू करता है, हमेशा इसे हर उस जगह पर उपयोग क्यों नहीं किया जाता है जहां IEnumerable या ICollection की आवश्यकता होती है। क्या हमेशा सूची का उपयोग करने से प्रदर्शन पर असर पड़ेगा? इन चिंताओं के जवाब के लिए कृपया अपने उत्तर को संपादित करें
पंकज उपाध्याय

मैंने आपके प्रदर्शन के सवालों के जवाब देने के लिए संपादन किया
जलयान

+1, लेकिन मैं जोड़ूंगा कि दुर्लभ मामलों में जहां आपको वास्तव में किसी सूची को किसी विधि को पास करने की आवश्यकता होती है, आपको विधि घोषणा के IListबजाय इसका उपयोग करना चाहिए List
कोनामिमन

@Konamiman - यदि आपको List<>विशिष्ट कार्यक्षमता की आवश्यकता है, जैसे निर्भर करता है .AddRange()। वह IList<>उजागर नहीं करता है।
बोबसन

6

ICDNlection और IEnumerable के लिए MSDN पृष्ठों पर एक नज़र है ।

बहुत सार शब्दों में, यह है कि मैं इन प्रकारों के बारे में कैसे कल्पना करता हूं।

एक IEnumerable कुछ भी है कि enumerated किया जा सकता है - वह है, iterated। यह जरूरी नहीं कि 'संग्रह' हो; उदाहरण के लिए, एक IQueryable IEnumerable लागू करता है और यह एक संग्रह नहीं है, लेकिन कुछ ऐसा है जो वस्तुओं को वापस करने के लिए समझा जा सकता है। IEnumerable को लागू करने के लिए एक वस्तु को केवल एक वस्तु को लौटाने में सक्षम होने की आवश्यकता होती है। मैं यह कह सकता हूं कि मेरे पास आज के कामों की संख्या है जो मैं आज करने जा रहा हूं (यह एक सूची नहीं है क्योंकि मैंने इसे लिखा नहीं है या इसे तैयार नहीं किया है, लेकिन मैं आपको बता सकता हूं कि मैं अब क्या करने जा रहा हूं, और अगर आपने पूछा 'और फिर?' तो मैं आपको निम्न कार्य बताने में सक्षम हूँ)।

एक IEnumerable की तुलना में एक ICollection अधिक ठोस है। एक महत्वपूर्ण अंतर यह है कि एक संग्रह जानता है कि इसमें कितने आइटम हैं; यह पता लगाने के लिए कि आपके द्वारा प्रभावी रूप से लूप करने वाली गणना में कितने आइटम हैं, उन्हें गिनें:

मैं: दोस्तों, आप में से कितने आइटम हैं?

Enumerable: मैं वास्तव में नहीं जानता। खैर, यहाँ एक आइटम है। मुझे एक और मिल गया है, इसलिए वह दो हैं। और एक और, इसलिए वह तीन है ... और दूसरा एक ... ठीक है तो यह है कि 2382 है। कोई और आइटम नहीं है, इसलिए मुझे 2382 मिला है। मुझे फिर से न पूछें क्योंकि मुझे उन सभी के माध्यम से फिर से जाना होगा।

संग्रह: मुझे 2382 आइटम मिले हैं। मुझे पहले से यह पता है।

एक संग्रह आम तौर पर कुछ ऐसा होता है जो पहले से ही जानता है कि इसके सभी तत्व कहां हैं, और जब आप उनके लिए पूछते हैं तो उन्हें जाने और खोजने या उत्पन्न करने की आवश्यकता नहीं होगी। यह अधिक ... एक Enumerable से ठोस है।

मेरी राय में एक Enumerable और एक Collection के बीच का अंतर एक Collection और List के बीच के अंतर से बहुत बड़ा है। वास्तव में मैं एक संग्रह और सूची के बीच व्यावहारिक अंतर के बारे में सोचने के लिए संघर्ष कर रहा हूं, लेकिन मेरा मानना ​​है कि सूची खोज और ऑर्डर करने के लिए बेहतर तरीके प्रदान करती है।

अन्य प्रकार के संग्रह शामिल हैं Queueऔर Stack, साथ ही साथ Dictionary

इन प्रकारों के नाम काफी उपयोगी हैं - आप उनके वास्तविक दुनिया समकक्षों के रूप में एक कतार और एक स्टैक के बारे में गर्भधारण कर सकते हैं, और उन अंतरों पर विचार कर सकते हैं जो आपके पास हो सकते हैं।


"मैं एक संग्रह और एक सूची के बीच एक व्यावहारिक अंतर के बारे में सोचने के लिए संघर्ष कर रहा हूं" ... बाद में आपके जवाब में आप खुद इस बात का जवाब देते हैं। एक Listएक है ICollection, लेकिन एक ICollectionहमेशा एक नहीं है List( Queue, Stack, Dictionary, ...)
स्टीवन Jeuris

@ यह एक बहुत ही रोमांचक जवाब है। मैं मानता हूं कि यह एक महत्वपूर्ण अंतर है, लेकिन मैं इसे व्यावहारिक अंतर नहीं कहूंगा। इसका उपयोगकर्ता के लिए क्या मतलब है?
कर्क ब्रॉडहर्स्ट

यह आसान है! :) Queue<int> queue = (Queue<int>)list;फेंक देंगे InvalidCastExceptionजब listएक नहीं है Queue<int>। कतार और सूची के बीच का अंतर इस प्रश्न के दायरे से बाहर है।
स्टीवन ज्यूरिस

IEnumerable का महत्वपूर्ण पहलू यह नहीं है कि यह वर्तमान और अगले आइटमों को वापस कर सकता है - आप उस पर किसी तरह का बदलाव कर सकते हैं, लेकिन स्पष्ट रूप से ऐसा नहीं कहेंगे। अनिवार्य रूप से कुछ है कि केवल IEnumerable लागू करता है अपने सदस्यों की एक मनमाना मद वापस नहीं कर सकते हैं जब - केवल वर्तमान एक और अगले एक।
cori

@ कोरी यह डालने का एक बहुत ही रसीला तरीका है, मेरे जवाब से बहुत स्पष्ट है।
कर्क ब्रॉडहर्स्ट

-1

IQueryable:

क्वेरी को तब तक निष्पादित नहीं किया जाता है जब तक कि आइटम पर वास्तव में पुनरावृति न हो, हो सकता है कि एक .ToList () करके

IEnumerable:

आगे-केवल वस्तुओं की सूची। आप 0-3 आइटम पास किए बिना "आइटम 4" पर प्राप्त नहीं कर सकते। केवल-पढ़ने के लिए सूची, आप इसे जोड़ नहीं सकते हैं या इससे निकाल नहीं सकते हैं। अभी भी स्थगित निष्पादन का उपयोग कर सकते हैं।

IList:

पूरी तरह से स्मृति में पूरी सूची के लिए यादृच्छिक उपयोग जोड़ने और हटाने का समर्थन करता है

ICollection:

IEnumerable और IList के बीच है। "सर्वश्रेष्ठ" क्या है यह आपकी आवश्यकताओं पर निर्भर करता है। आम तौर पर हालांकि एक IEnumerable "काफी अच्छा" है यदि आप केवल आइटम प्रदर्शित करना चाहते हैं। कम से कम हमेशा जेनेरिक वेरिएंट का उपयोग करें।


यह उत्तर पहले के उत्तर में पहले से ही पोस्ट किए गए से अधिक मूल्यवान कुछ भी नहीं जोड़ता है
gnat

यह सभी के बारे में एक सरल अवधारणा है
जिया क़मर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.