यदि मेरे पास ऐसा कोई फ़ंक्शन है जो किसी निश्चित प्रकार का संग्रह लेता है, तो मुझे किस पैरामीटर प्रकार का उपयोग करना चाहिए?
मैंने पहले माना है कि IEnumerable
डिफ़ॉल्ट है, लेकिन मुझे यह जानना है कि यह सही है और यदि ऐसा है, तो क्यों।
ICollection
भी एक वैध उम्मीदवार (इसके नाम के कारण) जैसा लगता है, लेकिन मुझे लगता है कि इंप्रेशनबेल अधिक उपयोगकर्ता के अनुकूल हैं।
मुझे लगता है कि ढांचे के उदाहरणों को देखते हुए हमें एक अच्छा विचार होगा, लेकिन मुझे लगता है कि String.Join
जैसे कुछ, तारों की एक सरणी के लिए पूछते हैं।फ़ंक्शन पैरामीटर: IENumerable, ICollection या array?
उत्तर
आप वह व्यक्ति लेते हैं जो कम से कम ग्राहकों पर लगाता है लेकिन आपको अपना काम पूरा करने की अनुमति देता है। यदि आप IEnumerable<T>
से ICollection<T>
पर जा सकते हैं, तो आपको इसका उपयोग करना चाहिए क्योंकि यह आपके एपीआई के ग्राहकों को अधिक लचीलापन देता है।
आईकॉलेक्सेबल आईसीओलेक्शन पर अधिक पसंद करते हैं। Here आपके प्रश्न का उदार जवाब है।
इंटरफेस ज्यादातर पैरामीटर के रूप में या वापसी कार्यों में कास्टिंग आसान, interfaced मानकों करने के लिए कई ठोस प्रकार गुजर समर्थन करने के लिए और छुपा बनाने (encapsulating) वास्तविक के लिए I
SOLID
में डिजाइन सिद्धांत (इंटरफ़ेस पृथक्करण सिद्धांत) का समर्थन करने के लिए उपयोग किया जाता प्रकार आपके सार्वजनिक कार्यों के ग्राहकों से पैरामीटर प्रकार।
- बारे
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 देखें।
-1: मैं और असहमत नहीं हो सका। ** हमेशा ** (हमेशा के दिए गए मान के लिए) न्यूनतम अमूर्तता का उपयोग करें जो काम पूरा करता है, इस तरह आपका क्लाइंट कोड (जिस कोड को आप लिख रहे हैं) उसी कंटेनर का उपयोग करने के लिए बाध्य नहीं है, आप कार्य कर रहे हैं अधिक सामान्य हो जाता है और पुनः उपयोग के लिए अधिक क्षमता होती है। –
खैर @ बाइनरीवायरियर मैंने आईएलिस्ट का उपयोग केवल तभी किया जब आइटम को जोड़ने या हटाने का समर्थन आवश्यक हो और आईन्यूमेरेबल का उपयोग करने के लिए केवल फोरच समर्थन की आवश्यकता हो .. मुझे आशा है कि अब आप बेहतर उत्तर समझेंगे .. – VS1
क्षमा करें लेकिन मैं अभी भी असहमत हूं। 'IENumerable
- 1. क्यों ArrayList IList, ICollection, IENumerable लागू करता है?
- 2. IEnumerable <IEnumerable <string>> से ICollection <T>
- 3. ICollection <T> क्यों लागू करता है दोनों IEnumerable <T> और IEnumerable
- 4. IENumerable <T> या ICollection <T> बनाने के लिए सबसे आसान और सबसे कॉम्पैक्ट तरीका क्या है?
- 5. फ़ंक्शन पैरामीटर: कॉपी या पॉइंटर?
- 6. जावा: पता लगाएं कि फ़ंक्शन को varargs या array
- 7. टी? AddRange ICollection?
- 8. गैर सामान्य ICollection
- 9. क्यों या ICollection <T>
- 10. एक पैरामीटर या कई
- 11. क्लोजर फ़ंक्शन का पैरामीटर पैरामीटर।
- 12. फ़ंक्शन पैरामीटर
- 13. php array
- 14. numpy array
- 15. numpy.matrix या array को scipy sparse matrix
- 16. सी ++ 11 std :: array
- 17. XmlSerializer IENumerable
- 18. numpy array
- 19. एक numpy array
- 20. int [] array
- 21. डब्ल्यूसीएफ सेवा फ़ंक्शन पैरामीटर
- 22. अपवाद में फ़ंक्शन पैरामीटर
- 23. KeyValuePair Array
- 24. numpy array
- 25. jsp: param param array
- 26. IEnumerable
- 27. IENumerable
- 28. jagged array
- 29. पैरामीटर मान और फ़ंक्शन पैरामीटर प्रकार
- 30. ICollection को <T>
यह यहां से पहले उत्तर दिया गया है: http://stackoverflow.com/questions/3559868/list-ilist-ienumerable-iqueryable-icollection-which-is-most-flexible-return बेस्ट सादर। – Oscar
['String.Join'] (http://msdn.microsoft.com/en-us/library/dd992421.aspx) ने .NET 4 टाइमफ्रेम में एक अधिभार जोड़ा था ताकि यह' IENumerable' ले सके। पूर्व-जेनेरिक दिनों से सरणी तिथियां लेना ओवरलोड ... –
@ ऑस्कर: यह रिटर्न प्रकार के बारे में है- मैं बात कर रहे पैरामीटर हैं। –