2010-02-04 16 views
5

मैं विशेष रूप से सामान्य वर्ग HashSet<T> के बारे में सोच रहा हूं। यह कई इंटरफेस लागू करता है, लेकिन कोई भी सेट के सही अर्थशास्त्र का खुलासा नहीं करता है। विशेष रूप से, विधि bool लौटने की विधि का समर्थन नहीं करता है। (ICollection<T>void Add का समर्थन करता है, जिसका उपयोग चुटकी में किया जा सकता है।) इन इंटरफेस द्वारा असमर्थित यूनियनों और चौराहे जैसे सामान्य सेट ऑपरेशंस भी हैं। (हालांकि यह कहा जाना चाहिए कि इनमें से कुछ ऑपरेशन एक्सटेंशन के माध्यम से IEnumerable<T> पर उपलब्ध हैं।).NET ढांचे में "सेट" इंटरफ़ेस क्यों नहीं है?

इसका मतलब है कि कक्षा को केवल इसके प्रत्यक्ष कार्यान्वयन के साथ सेट की तरह ही उपयोग किया जा सकता है। यानी, आप ऐसा कुछ नहीं कर सकते:

ISet<int> = new HashSet<int>; 

जहां तक ​​मुझे पता है, वैसे भी। तो क्या इसे छोड़ने के लिए पसंद को प्रेरित किया?

शायद सबसे महत्वपूर्ण बात ये है: भले ही आप HashSet<T> से ICollection<T> एट अल कास्ट कर सकें, आप जिस एपीआई को उजागर कर रहे हैं उसमें आप अर्थपूर्ण मूल्य खो देते हैं। यही है, आपके एपीआई के उपभोक्ताओं को कोई संकेत नहीं है कि वे एक सेट के साथ काम कर रहे हैं। तो जब आप ICollection<T>.Add पर कॉल कर सकते हैं और प्राप्त कर सकते हैं, तो वे भ्रमित हो जाएंगे यदि वे दो बार आइटम जोड़ने का प्रयास करते हैं और यह काम नहीं करता है। एक सेट इंटरफ़ेस लोगों को सही उम्मीदों को देगा।

+0

'आईसेट ' क्या होगा 'आईसीओलेक्शन ' के पास नहीं है? –

+0

ओह मुझे लगता है कि मैं देखता हूं ... एक 'जोड़ें' विधि जो 'बूल' देता है, आह? –

+0

@dan - आप एक सेट में डुप्लिकेट नहीं जोड़ सकते हैं। – UpTheCreek

उत्तर

8

जबकि मुझे यकीन नहीं है कि इसे पहले बेस क्लास लाइब्रेरी में क्यों नहीं बनाया गया है, तो ISet .NET 4.0 में उपलब्ध है, जो शिपिंग से केवल सप्ताह है। इंटरफ़ेस में अधिकांश तरीकों से आप एक सेट पर अपेक्षा करेंगे।

  • जोड़ें, साफ़, शामिल हैं, CopyTo, GetEnumerator, निकालें (विरासत में मिला है)
  • ExceptWith
  • IntersectWith
  • IsSubsetOf
  • IsSupersetOf
  • ओवरलैप नहीं
  • : ये समर्थित तरीकों में से कुछ हैं
  • यूनियनविथ

HashSet और SortedSet संग्रह इस नए इंटरफ़ेस को लागू करते हैं।

+0

ओह हाँ? महान। – UpTheCreek

+1

यह वास्तव में यह भी जांचने के लिए नहीं हुआ कि यह .NET 4.0 में होगा या नहीं। मैंने सोचा कि अगर इसे अब तक शामिल नहीं किया गया था, तो इसके लिए कुछ कारण होना चाहिए। :) मैं भविष्य की परियोजनाओं के लिए इसके लिए तत्पर हूं। –

0

Iesi.Collections.ISet देखें जो मानक कार्यक्षमता से इस कार्यक्षमता को याद करता है।

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