2009-11-09 12 views
9

या अन्य तरीकों के आसपास?Inumerable <T> पर सूची <T> का उपयोग करने का क्या फायदा है?

मैं हर समय जेनेरिक सूचियों का उपयोग करता हूं। लेकिन मैं कभी-कभी आईन्यूमेरबल्स के बारे में भी सुनता हूं, और मुझे ईमानदारी से कोई सुराग नहीं है (आज) वे क्या हैं और मुझे उनका उपयोग क्यों करना चाहिए। तो, नेट पर कुछ होने के जोखिम पर हमेशा मेरी अज्ञानता का प्रचार करने के जोखिम पर, मैं नम्रतापूर्वक इस सवाल को पोस्ट करता हूं।

+0

क्या आपका मतलब IList था? –

+0

नहीं। मुझे यकीन है कि मेरी सूची नहीं है। –

उत्तर

16

अच्छा, List<T> लागू IEnumerable<T> ... मूल रूप से IEnumerable<T> आइटमों का एक अनुक्रम है। आप इसके माध्यम से पढ़ सकते हैं, और यह सब कुछ है।

List<T> एक परिवर्तनशील संग्रह है - आप, यह करने के लिए जोड़ सकते हैं इसे से निकालने के लिए, प्रकार यह आदि यह अपने आप में और अधिक लचीला है, लेकिन IEnumerable<T> आप (सरणियों, लिंक किए गए सूचियों किसी भी कार्यान्वयन के साथ काम करने के लिए एक ही कोड का उपयोग करने की अनुमति देता है, सूचियां, iterators yield कथन आदि का उपयोग कर विधियों से लौट आए)।

+0

चूंकि 'IENumerable ' अपरिवर्तनीय है, इसलिए आप इस कक्षा का उपयोग करके अपने इंटरफ़ेस का उपयोग कर सकते हैं कि यह जानने के लिए कि कोई भी तत्व जोड़ा या हटाया नहीं जा सकता है। यद्यपि उपयोगकर्ता अभी भी _within_ संख्याओं वाली वस्तुओं पर उत्परिवर्तन कार्यों को कॉल कर सकता है। –

+3

@ मार्सेल: बिल्कुल सही ध्यान दें। 'IENumerable 'इंटरफ़ेस में अनुक्रम को बदलने के लिए कोई विधि नहीं है। ठोस कार्यान्वयन म्यूटेबल हो सकता है या नहीं भी हो सकता है। यदि कोई विधि हस्ताक्षर कहता है कि यह 'IENumerable ' देता है और कोड 'सूची ' देता है, तो कॉलिंग कोड आसानी से लौटाई गई वस्तु को 'सूची ' पर आसानी से डाल सकता है और सूची की सामग्री को बदल सकता है। हालांकि हस्ताक्षर * संवाद करता है कि परिणाम केवल पढ़ने के लिए माना जाना चाहिए *। –

+1

कॉल साइट पर 'IList ' पर वापस डालना अभी भी संभव है, इसलिए यह बुलेट प्रमाण नहीं है। – recursive

6

IEnumerable<T> एक और सामान्य इंटरफ़ेस है, इसलिए आप अपने ऑपरेशन के लिए उस इंटरफ़ेस को लागू करने वाले किसी भी चीज़ को प्रतिस्थापित कर सकते हैं।

public void DoSomething(IEnumerable<T> enumerable) { 
} 

यह सरणियों, संग्रह, सूचियों, शब्दकोशों, और कुछ और है कि इंटरफ़ेस को लागू करता है पर काम करेंगे: आप इस विधि है।

यदि आप निर्दिष्ट करते हैं कि ऑब्जेक्ट List<T> है, तो यह विधि केवल List<T> ऑब्जेक्ट्स या उसके द्वारा प्राप्त होने वाले उदाहरणों पर काम करेगी।

List<T> का उपयोग करने का लाभ यह है कि सूचियों में संख्याओं की तुलना में कई और विशेषताएं हैं। जब आपको उन विशेषताओं (सम्मिलन, खोज, रूपांतरण, और कई अन्य) की आवश्यकता होती है, List<T> या IList<T> अधिक उपयुक्त है।

1

सूची IENumerable पर अतिरिक्त विधियां प्रदान करती है। आप IENumerable के साथ सम्मिलित या हटा नहीं सकते हैं, लेकिन आप सूची के साथ कर सकते हैं।

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

2

List<T>IEnumerable<T> से अधिक का सबसे बड़ा लाभ

  1. रैंडम एक्सेस
  2. अनुसरण कर रहे हैं "को छिपाने" कर सकते हैं
  3. गणना संपत्ति
  4. foreach विधि
  5. अस्थिरता

पहले 2 IEnumerable<T> पर भी करना आसान है लेकिन आप ओ (1) गति की गारंटी नहीं दे सकते। गणना के मामले में आप वास्तविक उत्तर की गारंटी भी नहीं दे सकते क्योंकि IEnumerable<T> आसानी से अनंत सूचियों का प्रतिनिधित्व कर सकता है।

0

यदि आपको केवल IEnumerable<T> में उजागर और कार्यान्वित की गई कार्यक्षमता की आवश्यकता है, तो आपको इसके साथ जाना चाहिए। एक विकल्प IEnumerable<T> where T : IFoo है यदि आप उन ऑब्जेक्ट्स को पुन: सक्रिय करने में सक्षम होना चाहते हैं जो इंटरफ़ेस IFoo लागू करते हैं।यदि आपको, हालांकि, Count जैसे गुणों की आवश्यकता होती है और ऐसे List<T> का खुलासा होता है, तो आपको इसके लिए जाना चाहिए। सबसे कम आम denominator खोजें और इसके साथ जाओ क्योंकि यह आपके तरीकों के साथ काम करने के लिए और अधिक बहुमुखी और आसान बनाता है।

0

आईन्यूमेरेबल में एक साफ-सुथरा और 'गणना करने योग्य' या 'queriable' semantics है। सूची के साथ ऐसा लगता है कि आप इसे किसी भी को संशोधित करने की अनुमति देते हैं :)।

6

जॉन स्कीट और अन्य ने आईन्यूमेरेबल पर सूची की कार्यक्षमता का एक अच्छा सारांश दिया है, इसलिए मैंने सोचा कि मैं प्रश्न के दूसरे आधे हिस्से को भर दूंगा जो "सूची में IENumerable का उपयोग करने के क्या फायदे हैं?"।

सबसे पहले, आईनेमरेबल उन चीज़ों के संग्रह का प्रतिनिधित्व करने के लिए एक अधिक सामान्य अनुबंध प्रदान करता है जो आप पुन: सक्रिय कर सकते हैं और इसलिए आपको Principle of Least Privilege का पालन करने की अनुमति मिलती है। दूसरे शब्दों में, IENumerable को अपने व्युत्पन्न प्रकारों पर प्राथमिकता दी जानी चाहिए जहां गणना केवल एक ही व्यवहार है जिसे कार्य के लिए प्रकट किया जाना चाहिए। यह फायदेमंद है क्योंकि सूचना और/या व्यवहार को उजागर करने से आपके एपीआई को अनावश्यक उपयोगों तक अनावश्यक रूप से खुलता है जो सुरक्षा समस्या उत्पन्न कर सकता है या आपके एपीआई और उसके उपभोक्ताओं के बीच अनपेक्षित युग्मन का कारण बन सकता है।

दूसरा, आईनेमरेबल गणना के लिए एक अमूर्त है जबकि सूची उस अमूर्तता का एक कार्यान्वयन है। Design Patterns - Elements of Reusable Object-Oriented Software के मार्गदर्शन के बाद, कार्यान्वयन पर अबास्ट्रक्शन के लिए प्रोग्रामिंग अनुप्रयोगों को उपभोग करने वाले कोड को प्रभावित किए बिना कार्यान्वयन को बदलने की अनुमति देकर बदलने के लिए अधिक लचीला बनाने में सहायता करता है। यदि आपको सूची व्यवहार की आवश्यकता है, तो आपको सीधे सूची के बजाय IList का खुलासा करना चाहिए।

+0

उत्कृष्ट प्रतिक्रिया। आप खेल में थोड़ा देर हो चुकी हैं, लेकिन मैं पूरी तरह से सहमत हूं। मैंने पिछले नवंबर के बाद से बहुत कुछ सीखा है :) :) –

+0

मैंने सोचा कि मैं वंश के लिए वजन में रहूंगा :) –

0

आईनेमेरेबल के लिए एक लाभ जिसका अभी तक उल्लेख नहीं किया गया है: Contravariance। एक आईनेमरेबल (कार का) की उम्मीद की जाने वाली नियमितता पूरी तरह से खुश होगी यदि एक आईनेमेरेबल (होंडासिविक का) दिया जाता है, जिसका अर्थ यह है कि यह एक आईलीस्ट (होंडासिविक के) से खुश होगा। इसके विपरीत, एक पॉलिसी जो एक आईलीस्ट (कार का) की उम्मीद करती है वह एक आईलीस्ट (होंडासिविक के) से संतुष्ट नहीं होगी। यदि माइक्रोसॉफ्ट आईलीस्ट को केवल पढ़ने योग्य आईआरडेबलबैंडेक्स इंटरफ़ेस से लिया गया था, तो कोड जो आईआरएडेबलबीइंडेक्स (कार का) की अपेक्षा करता है, वह इरेडेबलबीइंडेक्स (होंडासिविक के) से पूरी तरह से खुश होगा, लेकिन यह पुल के नीचे पानी है।

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