2011-10-05 7 views
80

में मैंने कुछ एंटीटी फ्रेमवर्क अनुप्रयोगों को डिजाइन करने के लिए पहले सिर पर जाने से पहले केवल कुछ वेबकास्ट देखे। मैंने वास्तव में इतना दस्तावेज नहीं पढ़ा और मुझे लगता है कि अब मैं इसके लिए पीड़ित हूं।आईसीओलेक्शन <T> वीएस सूची <T> इकाई फ्रेमवर्क

मैं अपने कक्षाओं में List<T> का उपयोग कर रहा हूं, और यह बहुत अच्छा काम करता है।

अब मैंने कुछ दस्तावेज पढ़ लिए हैं और यह बताता है कि मुझे ICollection<T> का उपयोग करना चाहिए था। मैंने इसे बदल दिया, और इससे मॉडल संदर्भ में परिवर्तन भी नहीं हुआ। ऐसा इसलिए है क्योंकि List<T> और ICollection<T> दोनों IEnumerable<T> उत्तराधिकारी हैं, और वास्तव में ईएफ के लिए आवश्यक है?

हालांकि, यदि ऐसा है, तो ईएफ दस्तावेज क्यों नहीं बताता है कि के बजाय IEnumerable<T> की आवश्यकता है?

किसी भी मामले में, क्या मैंने जो किया है, उसके लिए कोई डाउनसाइड्स हैं, या क्या मुझे इसे बदलना चाहिए?

उत्तर

79

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

भी ध्यान रखें कि आप थेICollection<T> का उपयोग कर, आप केवल यह List<T> कार्यान्वयन के रूप में उजागर किया गया। List<T> इसके साथ IList<T>, ICollection<T>, और IEnumerable<T> के साथ लाता है।

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

+1

तो .... मुझे थोड़ी आगे समझने के लिए बस के लिए - सूची विरासत IList, जो ICollection विरासत है, जो IEnumerable विरासत ? – wil

+1

हाँ, वह श्रृंखला है। 'सूची ' विरासत पदानुक्रम के कारण उन सभी इंटरफेस को लागू करना है ('IList ', 'ICollection ', 'IENumerable ')। पूरा होने के लिए, 'IList ' गैर-जेनेरिक 'IList', 'ICollection' और' IENumerable' इंटरफेस भी उठाता है। –

+0

धन्यवाद ... कुछ Ixxx सुविधाओं में अभी भी मेरी समझ से बचें! हालांकि, आपको समझ में आया है कि एक आखिरी चीज जो मुझे परेशान कर रही है, अगर अन्य आईओएस के आईन्यूमेरेबल का उत्तराधिकारी है, तो आईन्यूमेरेबल में केवल यह कैसे पढ़ा जाता है यदि यह केवल एक पढ़ा जाता है? ... यदि यह बहुत जटिल है, तो चिंता न करें, जब मेरे पास थोड़ा समय लगेगा, तो मैं परावर्तक को आग लगाने की कोशिश करूंगा! – wil

40

उन्होंने उठाया इंटरफेस उन्होंने किया क्योंकि यह लिंक का उपयोग करते समय एंटीटी फ्रेमवर्क निष्पादित करता है, यह जादू प्रश्नों पर एक समझदार अमूर्तता देता है।

  • IEnumerable<T> केवल पढ़ने के लिए
  • आप जोड़ सकते हैं और एक ICollection<T>
  • आप रैंडम एक्सेस (सूचकांक) के द्वारा कर सकते हैं करने के लिए एक List<T>
  • के आइटम निकाल सकते हैं है:

    यहाँ इंटरफेस के बीच का अंतर है

उनमें से ICollection और IEnumerable डेटाबेस संचालन के लिए अच्छी तरह से मानचित्र, क्वेरीिंग और जोड़ने/संस्थाओं को हटाने से आप डीबी में चीजें कर सकते हैं।

इंडेक्स द्वारा यादृच्छिक पहुंच भी मैप नहीं करती है, क्योंकि आपके पास मौजूदा क्वेरी परिणाम फिर से चालू होना होगा, या प्रत्येक यादृच्छिक पहुंच डेटाबेस से फिर से पूछेगी। इसके अलावा, सूचकांक मानचित्र क्या होगा? पंक्ति संख्या? वहां बहुत सारे पंक्ति संख्या प्रश्न नहीं हैं जिन्हें आप करना चाहते हैं, और बड़े प्रश्नों को बनाने में यह उपयोगी नहीं है। तो वे बस इसका समर्थन नहीं करते हैं।

ICollection<T> समर्थित है, और आपको क्वेरी और डेटा दोनों बदलने की अनुमति देगा, इसलिए इसका उपयोग करें।

कारण List<T> शुरू करने के लिए काम करता है क्योंकि ईएफ कार्यान्वयन अंत में एक को वापस करने के समाप्त होता है। लेकिन यह आपकी क्वेरी श्रृंखला के अंत में है, शुरुआत में नहीं। इसलिए आपकी गुण ICollection<T> बनाने से यह और अधिक स्पष्ट हो जाएगा कि ईएफ एसक्यूएल का एक गुच्छा बनाता है और आपके द्वारा उपयोग किए जाने वाले लिंक के प्रत्येक स्तर के लिए प्रश्न करने के बजाय, केवल List<T> देता है।

8

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

+1

मैं समझना चाहता हूं - आप सूची के साथ एक ही ऑपरेशन (और अधिक!) कर सकते हैं। आईसीओलेक्शन क्यों? सूची क्यों नहीं? सरल और अधिक शक्तिशाली लग रहा है। – monstro

+0

सूची आईसीओलेक्शन और आईनेमरेबल लागू करता है।अधिक ऑपरेशन लेकिन इसके साथ अधिक ओवरहेड आता है। –

2

हालांकि प्रश्न साल पहले पोस्ट किया गया है, फिर भी यह तब भी वैध है जब कोई एक ही परिदृश्य की तलाश में है।

हाल ही में [2015] कोडप्रोजेक्ट आलेख है जो नमूना कोड के साथ अधिक विस्तार और ग्राफिकल प्रतिनिधित्व में अंतर बताता है। यह सीधे एफई पर केंद्रित नहीं है, लेकिन अभी भी आशा है कि यह अधिक से अधिक मदद की हो जाएगा:

List vs IEnumerable vs IQueryable vs ICollection vs IDictionary

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