2012-10-31 22 views
18

का उपयोग करके कस्टम संग्रह मुझे अपनी खुद की कस्टम GenericCollection कक्षा को डिज़ाइन करने की आवश्यकता है। अब मेरे पास IEnumerable, ICollection, और IList का उपयोग करके इसे प्राप्त करने के लिए बहुत सारे विकल्प हैं, जहां बाद में कुछ अतिरिक्त कार्यक्षमताएं प्रदान की जाती हैं।आईएनयूमेरेबल बनाम आईसीओलेक्शन बनाम आईएलआईस्ट

मुझे थोड़ा उलझन में है कि अगर मैं IEnumerable<T> के साथ जाता हूं तो मुझे ऑब्जेक्ट को इस मामले में _list जैसे संग्रह को रखने की आवश्यकता हो सकती है।

public class GenericCollection<T> : IEnumerable<T> 
{ 
    private List<T> _list; 
    //... 
} 

लेकिन अगर मैं ICollection<T> या IList<T> साथ जाना, मैं List वस्तु घोषित करने के लिए की आवश्यकता नहीं है के रूप में यह परोक्ष उपलब्ध है।

public class GenericCollection<T> : IList<T> 
{ 
    // no need for List object 
    //private List<T> _list; 
    //... 
} 

प्रदर्शन के संबंध में इन दो दृष्टिकोणों के बीच क्या अंतर है?

किस परिदृश्य में प्रत्येक को प्राथमिकता दी जाती है, खासकर जब यह आपके स्वयं के संग्रह को डिजाइन करने की बात आती है। मुझे अच्छे प्रदर्शन के साथ हल्के वजन संग्रह में रूचि है। मुझे लगता है कि यह IEnumerable<T> का उपयोग करके हासिल किया जा सकता है लेकिन इसके साथ जाने के कुछ मजबूत कारणों के साथ कैसे?

मैंने कुछ मौजूदा पोस्ट की समीक्षा की है लेकिन कोई भी आवश्यक जानकारी नहीं दे रहा है।

Returning 'IList' vs 'ICollection' vs 'Collection'

+0

आपको पहले उदाहरण में _list सदस्य होने की आवश्यकता नहीं है। इसके अलावा, आपको अभी भी आईएलिस्ट –

उत्तर

37

IEnumerable, ICollection, और IList (आम तौर पर, एक I उपसर्ग के साथ किसी भी प्रकार के) बस interfaces हैं। वे आपको बताएंगे कि आपकी कक्षा क्या करेगी, लेकिन अगर आप inherit कक्षा के विपरीत हैं, तो इंटरफेस आपको उन चीजों में से किसी एक का कार्यान्वयन नहीं देता है जो वे कहते हैं कि आपको करना होगा।

जहाँ तक चुनने जो इंटरफेस, यहाँ एक त्वरित मार्गदर्शिका के रूप में:

  • एक IList एक ICollection कि सूचकांक द्वारा पहुँचा जा सकता है।
  • एक ICollectionAdd, Remove, और Count जैसी चीजों के लिए आसान पहुँच के साथ एक IEnumerable है।
  • एक IEnumerable कुछ भी है जिसे समझाया जा सकता है, भले ही उन चीजों की सूची तब तक मौजूद न हो जब तक आप इसे गणना न करें।

कुछ वर्गों है कि आप विस्तार करने के लिए चाहते हो सकता है (या एक निजी क्षेत्र है कि तर्क के सबसे चलाता है के रूप में रखने के लिए) अपने संग्रह के लिए List<T>, Collection<T>, (जो IList<T> लागू करता है, लेकिन कार्यान्वयन अधिभावी के लिए आसान पहुँच के साथ कर रहे हैं, को देखने के इन दो के बीच बड़े अंतर के लिए Collection<T> versus List<T> what should you use on your interfaces?) ObservableCollection<T>, या संग्रह जो सूची नहीं हैं, जैसे Dictionary<T, U> और HashSet<T>। इनमें से किसी भी के बारे में अधिक जानकारी के लिए, कक्षा में एमएसडीएन दस्तावेज देखें।

0

प्रदर्शन निर्भर है जिस पर इंटरफेस कार्यान्वित कर रहे हैं होने की संभावना नहीं है। यह इस बात पर निर्भर करता है कि प्रोसेसर को एक निश्चित लक्ष्य प्राप्त करने के लिए कितने निर्देश चलाना है। यदि आप सूची में IENumerable को लागू करते हैं और लपेटते हैं, तो आप लिस्ट को जोड़ने/निकालने/[] विधियों को समाप्त करने की संभावना रखते हैं जो केवल सूची में कॉल का प्रचार कर रहे हैं, जो एक प्रदर्शन ओवरहेड जोड़ देगा। इसलिए, हालांकि मैंने कोई माप नहीं लिया है, विरासत दृष्टिकोण शायद बहुत तेज़ होगा।

हालांकि, ऐसे विवरण आमतौर पर केवल वास्तविक समय के अनुप्रयोगों के लिए महत्वपूर्ण होते हैं जिनके साथ हर संभव CPU चक्र को बचाने की अत्यधिक आवश्यकता होती है। एरिक लिपर्ट के पास इस तरह के विवरणों पर ध्यान देने के बारे में एक अच्छा लेख है: http://blogs.msdn.com/b/ericlippert/archive/2003/10/17/53237.aspx। आम तौर पर, आप उस दृष्टिकोण का उपयोग करके बेहतर होने की संभावना रखते हैं जो प्रदर्शन विवरण के बजाए आपके व्यवसाय के व्यावसायिक तर्क और वास्तुकला को बेहतर ढंग से फिट करता है।

1

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

प्रदर्शन के अनुसार, मुझे संदेह है कि आपको बहुत अधिक प्रभाव मिलेगा, जो आपको कार्यात्मक रूप से आवश्यक है पर ध्यान केंद्रित करें। निश्चित रूप से जानने का एकमात्र तरीका मापना है।

+0

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

+0

Ilist के रूप में Ilist को लागू करने के रूप में देखकर, आपको ILI लागू करने पर स्पष्ट रूप से इसे लागू करने की आवश्यकता नहीं है। मैं बस कहना चाहता था कि यह एक या/सवाल नहीं है। – Rik

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

  • कोई संबंधित समस्या नहीं^_^