2009-10-20 16 views
9

एसओ पर दो बार पूछा गया है कि आप एक बिडरेक्शनल एन्यूमेरेटर (here, here) को कैसे कार्यान्वित कर सकते हैं। मेरा सवाल (जो ज्यादातर मामलों के लिए तुच्छ है), लेकिन क्यों .NET प्लेटफ़ॉर्म में ऐसा कोई प्रकार मौजूद नहीं है।.NET के पास बिडरेक्शनल एन्युमरेटर क्यों नहीं है?

public interface IBidirectionalEnumerator<T> : IEnumerator<T> 
{ 
    bool MovePrev(); 
} 

जाहिर है, वहाँ कई संग्रह प्रकार जो इस लागू नहीं कर सकते, के रूप में MoveNext() विनाशकारी है या अंतर्निहित संग्रह की स्थिति में परिवर्तन कर रहे हैं। लेकिन इसके विपरीत, कई प्रकार इस trivially लागू कर सकते हैं (List, IList, LinkedList, array)।

ऐसा कोई प्रकार क्यों मौजूद नहीं है?

+4

आपके संग्रह डिज़ाइन के साथ कुछ गड़बड़ है यदि इसकी गणना करने से इसकी स्थिति बदल जाती है। – Joren

+0

सहमत हुए। लेकिन वास्तव में कुछ संग्रह हैं जो एक स्टैक या कतार की तरह गणना करते समय शॉल बदलते हैं। –

+2

जब तक आप एक स्ट्रीमिंग प्रकार या स्ट्रीमस्ट्रियर या फ़ाइलों की सूची जैसे सिस्टम पुनर्विक्रय पर लिपटे आईन्यूमेरेबल का उपयोग नहीं करते हैं। –

उत्तर

3
  • आईन्यूमेरेटर सी # फोरैच स्टेटमेंट के साथ-साथ अन्य भाषाओं की लूपिंग संरचनाओं का समर्थन करता है।
  • कोई कथन या सामान्य प्रोग्रामिंग मुहावरे नहीं है कि IBIDirectionalEnumerator सक्षम बनाता है।
+1

यह पूरी तरह से सच नहीं है। सी # केवल 'MoveNext' विधि और' Current' प्रॉपर्टी को काम करने की आवश्यकता है। यह बिल्कुल इंटरफेस पर भरोसा नहीं करता है। –

+3

वास्तव में 'foreach' के लिए' IENumerator 'की आवश्यकता नहीं है। जब तक आपकी कक्षा में एक विधि 'GetEnumerator()' है जो कोई पैरामीटर नहीं लेता है और उस ऑब्जेक्ट को लौटाता है जिसमें' ऑब्जेक्ट वर्तमान {get; } 'संपत्ति और एक 'शून्य MoveNext()' विधि, फिर' foreach' इसके साथ काफी खुशी से काम करेगा। –

+0

ग्रेग: वास्तव में ?! तो IENumerator प्रभावी ढंग से बतख टाइप किया गया है? यह एक रहस्योद्घाटन है। –

2

क्योंकि या तो कोई भी इसके बारे में सोचा है, या कोई भी नहीं सोचा था कि यह विशेष रूप से उपयोगी हो सकता है या क्योंकि वहाँ पर्याप्त बजट या ...

यह वास्तव में आवश्यक नहीं है नहीं था, यह क्या है? आप इसे आसानी से कार्यान्वित कर सकते हैं। हो सकता है कि बीसीएल टीम ने सोचा कि यह कार्यान्वयन, परीक्षण, दस्तावेज इत्यादि के दर्द के लायक नहीं था। किसी सुविधा की लागत को कम से कम न समझें, यह "आसान" लग सकता है, लेकिन इसकी लागतें होती हैं।

Particulary क्योंकि एक भी इंटरफ़ेस जो कोई भी लागू नहीं करता अजीब लगता है, है ना? इंटरफ़ेस को लागू करने के लिए आप सूची, ऐरे इत्यादि की अपेक्षा करेंगे, जो अंत में काफी काम है।

+0

हे, आईसीएलनेबल की तरह। = पी –

+0

जैसा कि रेमंड चेन कहेंगे, सभी सुविधाएं -100 अंक से शुरू होती हैं। –

1

इसके अलावा, इसके लिए प्रेरणा क्या होगी? "पिछड़ा" पुनरावृत्ति के लिए भाषा समर्थन?

इटरेटर पैटर्न तत्वों के एक सेट की "दिशात्मकता" की अवधारणा को अधिक भार नहीं देता है। यह एक सेट पर पुनरावृत्त करने के लिए एक सरल इंटरफ़ेस प्रदान करने के लिए एक सरल पैटर्न है।

4

जब आप एक ढांचा तैयार कर रहे हैं, तो आपको विभिन्न अमूर्त स्तरों पर सामान करने के बारे में निर्णय लेना होगा। व्यापार-बंद यह है कि यदि आप चीजों को एक उच्च अमूर्त स्तर पर उजागर करना चुनते हैं, तो आप चीजों पर बढ़िया दाग नियंत्रण खोने की लागत पर सामान्यीकरण प्राप्त करेंगे। यदि आप कम अमूर्त स्तर पर सामान का पर्दाफाश करना चुनते हैं, तो आपकी अवधारणा को भी सामान्यीकृत नहीं किया जा सकता है लेकिन आप निम्न स्तर पर विवरण नियंत्रित कर सकते हैं।

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

2

जाहिर है, वहाँ कई संग्रह प्रकार जो इस लागू नहीं कर सकते, के रूप में MoveNext() विनाशकारी है या अंतर्निहित संग्रह की स्थिति में परिवर्तन कर रहे हैं।

MoveNext() गैर विनाशकारी है।वास्तव में, यदि IEnumerator बनाया गया था और MoveNext() के समय के बीच अंतर्निहित संग्रह की स्थिति बदल दी गई है, तो MoveNext() पर कॉल विफल हो जाएगा।

IEnumerator का उद्देश्य संग्रह के मूल क्रम में, संग्रह के मूल क्रम में, सभी संग्रहों में एक बार फिर से संग्रह करना है। IEnumerator एक संग्रह-नेविगेशन डिवाइस के रूप में नहीं है, जैसे कोई C++ में मिल सकता है।

1

एक बड़ा सवाल यह है कि .Net इरेडेबलबैंडेक्स को लागू नहीं करता है, जो बदले में आईएलआईस्ट द्वारा विरासत में प्राप्त किया जाएगा। इस तरह के एक प्रकार ने पढ़ने-लिखने वाले आईएलआईटी कार्यान्वयन के उत्पादन के लिए आवश्यक काम में कुछ भी नहीं जोड़ा होगा, और केवल पढ़ने के लिए कार्यान्वयन के लिए आवश्यक काम को कम कर दिया होगा (जो आईएलआईडीएबलबीइंडेक्स को IList के बजाय लागू करेगा)।

हालांकि, "क्यों" पर विचार करना बहुत उपयोगी नहीं है। नेट यह है कि यह क्या है। .NET 5.0 के लिए स्थिति का समाधान करने का एकमात्र तरीका यह घोषणा करने के साधनों को अनुमति देना होगा कि एक इंटरफ़ेस जो रीड-राइट प्रॉपर्टी लागू करता है, को केवल पढ़ने-योग्य संस्करण को लागू करने के लिए समझा जा सकता है (ताकि IList को एक कॉन्वेंटेट प्राप्त करने की अनुमति दी जा सके एक स्पष्ट विधि प्राप्त करने के बिना ireadableByIndex)।

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