2012-06-11 9 views
6

यदि मेरे पास ऐसा कोई फ़ंक्शन है जो किसी निश्चित प्रकार का संग्रह लेता है, तो मुझे किस पैरामीटर प्रकार का उपयोग करना चाहिए?
मैंने पहले माना है कि IEnumerable डिफ़ॉल्ट है, लेकिन मुझे यह जानना है कि यह सही है और यदि ऐसा है, तो क्यों।
ICollection भी एक वैध उम्मीदवार (इसके नाम के कारण) जैसा लगता है, लेकिन मुझे लगता है कि इंप्रेशनबेल अधिक उपयोगकर्ता के अनुकूल हैं।
मुझे लगता है कि ढांचे के उदाहरणों को देखते हुए हमें एक अच्छा विचार होगा, लेकिन मुझे लगता है कि String.Join जैसे कुछ, तारों की एक सरणी के लिए पूछते हैं।फ़ंक्शन पैरामीटर: IENumerable, ICollection या array?

+1

यह यहां से पहले उत्तर दिया गया है: http://stackoverflow.com/questions/3559868/list-ilist-ienumerable-iqueryable-icollection-which-is-most-flexible-return बेस्ट सादर। – Oscar

+3

['String.Join'] (http://msdn.microsoft.com/en-us/library/dd992421.aspx) ने .NET 4 टाइमफ्रेम में एक अधिभार जोड़ा था ताकि यह' IENumerable' ले सके। पूर्व-जेनेरिक दिनों से सरणी तिथियां लेना ओवरलोड ... –

+7

@ ऑस्कर: यह रिटर्न प्रकार के बारे में है- मैं बात कर रहे पैरामीटर हैं। –

उत्तर

10

आप वह व्यक्ति लेते हैं जो कम से कम ग्राहकों पर लगाता है लेकिन आपको अपना काम पूरा करने की अनुमति देता है। यदि आप IEnumerable<T> से ICollection<T> पर जा सकते हैं, तो आपको इसका उपयोग करना चाहिए क्योंकि यह आपके एपीआई के ग्राहकों को अधिक लचीलापन देता है।

3

आईकॉलेक्सेबल आईसीओलेक्शन पर अधिक पसंद करते हैं। Here आपके प्रश्न का उदार जवाब है।

1

इंटरफेस ज्यादातर पैरामीटर के रूप में या वापसी कार्यों में कास्टिंग आसान, interfaced मानकों करने के लिए कई ठोस प्रकार गुजर समर्थन करने के लिए और छुपा बनाने (encapsulating) वास्तविक के लिए ISOLID में डिजाइन सिद्धांत (इंटरफ़ेस पृथक्करण सिद्धांत) का समर्थन करने के लिए उपयोग किया जाता प्रकार आपके सार्वजनिक कार्यों के ग्राहकों से पैरामीटर प्रकार।

  • बारे IEnumerable:

बहुत बुनियादी, यह प्रगणक, जो एक गैर सामान्य संग्रह से अधिक एक सरल यात्रा का समर्थन करता है उजागर करता है।

[ComVisibleAttribute(true)]  
public interface IEnumerable 
  • यहाँ ICollection के बारे में बताया गया है:

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

[ComVisibleAttribute (सही)] सार्वजनिक इंटरफ़ेस IList: ICollection, IEnumerable IList के बारे में MSDN से

अधिक: IList एक है

[ComVisibleAttribute(true)] 
public interface ICollection : IEnumerable 
  • यहाँ IList के बारे में इंटरफ़ेस है ICollection इंटरफ़ेस के वंशज और सभी गैर-जेनेरिक ली का मूल इंटरफ़ेस है sts। IList कार्यान्वयन तीन श्रेणियों में आते हैं: केवल पढ़ने के लिए, निश्चित आकार, और परिवर्तनीय आकार। केवल पढ़ने के लिए IList संशोधित नहीं किया जा सकता है।एक निश्चित आकार के IList तत्वों को जोड़ने या हटाने की अनुमति नहीं देता है, लेकिन यह मौजूदा तत्वों के संशोधन की अनुमति देता है। एक परिवर्तनीय आकार के IList तत्वों के अतिरिक्त, हटाने, और संशोधन की अनुमति देता है।

    युक्ति:

    तुम सिर्फ अपने संग्रह पैरामीटर के लिए foreach का समर्थन करना चाहते मामले में, IEnumerable पर्याप्त होना चाहिए। यदि आप संग्रह से आइटम जोड़ने और हटाने के लिए समर्थन भी चाहते हैं, तो IList बेहतर विकल्प है।

    सुझाव: इस ब्लॉग पोस्ट: IEnumerable, ICollection, IList Compared निश्चित रूप से आप बेहतर और सटीक निर्णय लेने के लिए मदद करनी चाहिए।

    इसके अतिरिक्त, प्रदर्शन और IList और IENumerable की अन्य तुलनाओं के लिए this article देखें।

+2

-1: मैं और असहमत नहीं हो सका। ** हमेशा ** (हमेशा के दिए गए मान के लिए) न्यूनतम अमूर्तता का उपयोग करें जो काम पूरा करता है, इस तरह आपका क्लाइंट कोड (जिस कोड को आप लिख रहे हैं) उसी कंटेनर का उपयोग करने के लिए बाध्य नहीं है, आप कार्य कर रहे हैं अधिक सामान्य हो जाता है और पुनः उपयोग के लिए अधिक क्षमता होती है। –

+0

खैर @ बाइनरीवायरियर मैंने आईएलिस्ट का उपयोग केवल तभी किया जब आइटम को जोड़ने या हटाने का समर्थन आवश्यक हो और आईन्यूमेरेबल का उपयोग करने के लिए केवल फोरच समर्थन की आवश्यकता हो .. मुझे आशा है कि अब आप बेहतर उत्तर समझेंगे .. – VS1

+0

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

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