संस्थाओं पर IList बनाम IEnumerable संग्रह के लिए


146

जब मेरे पास अपने डोमेन में चीज़ों की सूची है, तो क्या उन्हें ILists या IEnumerables के रूप में उजागर किया जाना चाहिए? जैसे ऑर्डर में ऑर्डरलाइन का एक गुच्छा होता है।


क्या दोनों को लागू करना बुद्धिमानी होगी?
PedroC88

4
यह नहीं होता। एक IList IEnumerable से विरासत में मिला है।
अज्ञात १

जवाबों:


183

IEnumerable<T>उन वस्तुओं की एक श्रृंखला का प्रतिनिधित्व करता है, जिन पर आप (उदाहरण के लिए, फ़ॉर्चेक का उपयोग करके) से पुनरावृति कर सकते हैं, जबकि IList<T>एक संग्रह है जिसे आप जोड़ या हटा सकते हैं।

आमतौर पर आप इसमें ऑर्डर-ऑर्डर जोड़कर या हटाकर एक ऑर्डर को संशोधित करने में सक्षम होना चाहते हैं, इसलिए आप शायद ऑर्डर करना चाहते हैं IList<OrderLine>

यह कहने के बाद कि, आपको कुछ रूपरेखा के डिजाइन के निर्णय लेने चाहिए। उदाहरण के लिए, क्या ऑर्डरलाइन के एक ही उदाहरण को दो अलग-अलग ऑर्डर में जोड़ना संभव है? शायद ऩही। इसलिए यह देखते हुए कि आप एक आदेश में जोड़ा जा सकता है या नहीं, यह सत्यापित करने में सक्षम होना चाहते हैं, आप वास्तव में केवल एक के रूप में लाइन्स की संपत्ति को IEnumerable<OrderLine>जोड़ना चाहते हैं , और Add (ऑर्डरलाइन) और निकालें (ऑर्डरलाइन) तरीके प्रदान कर सकते हैं जो संभाल सकते हैं वह मान्यता।


5
तुम भी एक का उपयोग कर सकते हैं IReadOnlyListया IReadOnlyCollectionअगर आप की जरूरत है सूची भौतिक है, लेकिन आप इसे से जोड़ना या निकालना नहीं चाहते हैं।
जुलैगनगन

फिर IReadOnlyListकोई मतलब नहीं है।
अंज

24

अधिकांश समय मैं अंत में ILnum के साथ IEnumerable पर जा रहा हूं क्योंकि IEnumerable की गणना विधि नहीं है और आप एक अनुक्रमणिका के माध्यम से संग्रह तक नहीं पहुंच सकते हैं (हालांकि यदि आप LINQ का उपयोग कर रहे हैं तो आप एक्सटेंशन विधियों के साथ इसे प्राप्त कर सकते हैं)।


1
मेरा मानना ​​है कि आप हमेशा IEnumerable के साथ एक IList कार्यान्वयन को तुरंत कर सकते हैं यदि आपको गणना विधि और उदाहरण के लिए इस तरह से एक्सेस करने की आवश्यकता है: IEnumerable <string> enumerable = <some-IEnumerable> List "स्ट्रिंग" myList = नई सूची <string> (असंख्य) ); हालाँकि, आप अपने संग्रह को कैसे उजागर करते हैं, इस पर विचार करना चाहिए जैसे कि क्या आप चाहते हैं कि संग्रह संपत्ति अपरिवर्तनीय हो (IEnumerable आपको संग्रह को संशोधित करने की अनुमति नहीं देगा) या नहीं (पढ़ें इलिस्ट)
सुधांशु मिश्रा

11
IEnumerable <T> .Count () यह देखने के लिए जांचता है कि क्या अंतर्निहित प्रकार एक ICollection <T> है जो एक गणना गुण को लागू करता है।
andleer

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