क्यों .net में ऑर्डरडेनडर का कोई सामान्य कार्यान्वयन नहीं है?


26

Microsoft ने क्रमबद्धता का सामान्य कार्यान्वयन क्यों नहीं किया?

कुछ कस्टम कार्यान्वयन मैंने देखे हैं, जिनमें शामिल हैं: http://www.codeproject.com/KB/recipes/GenericOrderedDictionary.aspx

लेकिन Microsoft ने इसे .net लाइब्रेरी में शामिल क्यों नहीं किया? निश्चित रूप से उनके पास जेनेरिक निर्माण न करने का एक कारण था .... लेकिन यह क्या है?

इस संदेश को पोस्ट करने से पहले, मैंने देखा: /programming/2629027/no-generic-implementation-of-ordereddEDIA

लेकिन यह सिर्फ पुष्टि करता है कि यह मौजूद नहीं है। ऐसा नहीं है कि इसका अस्तित्व क्यों नहीं है।

धन्यवाद


2
हमेशा होता है SortedDictionary<TKey, TValue>: msdn.microsoft.com/en-us/library/f7fta44c.aspx
ट्रैविस

2
जब तक मुझे SortedDict डॉक्स की गलतफहमी नहीं होगी, वह यह नहीं है कि मुझे क्या चाहिए। मैं कोई छँटाई नहीं चाहता। मुझे बस एक सरणी चाहिए, जिसे मैं कुंजी द्वारा भी एक्सेस कर सकता हूं। वैसे भी, मैं वास्तव में सोच रहा हूं कि एमएस ने इसे क्यों छोड़ दिया। (सूक्ष्म मुद्दों, आदि)
nonot1

एक आदेशित शब्दकोश के लिए एक विशिष्ट उपयोग का मामला क्या है? मैं अपने सिर के ऊपर से एक के बारे में सोचने के लिए संघर्ष कर रहा हूं।
कार्सन 63000

1
@ आपके पास कभी भी आपके पास डेटा आइटमों की एक ऐसी सरणी होती है जिसे आपको त्वरित रैंडम एक्सेस की आवश्यकता होती है। बस एक डिक्ट में स्टोर करने के लिए ऑर्डर करने की जानकारी खो देता है, और एक सरणी का उपयोग करके आपको अपना खुद का सूचकांक बनाए रखने की आवश्यकता होती है।
नॉनोट

2
एरिक लिपर्ट से पूछें और अपने प्रश्न का उत्तर दें। वह आमतौर पर इस प्रकार के प्रश्न के साथ मदद करने के लिए बहुत सहमत हैं। मुझे लगता है कि आप उनसे अपने ब्लॉग के माध्यम से संपर्क कर सकते हैं: blogs.msdn.com/b/ericlippert
devuxer

जवाबों:


17

में सी # 4.0 में संक्षेप मैं इस पढ़ें:

  1. एक OrderedDictionaryएक का एक संयोजन है HashTableऔरArrayList
  2. कोई जेनेरिक नहीं है ArrayList
  3. " ArrayListमुख्य रूप से फ्रेमवर्क 1.x के साथ पिछड़े संगतता के लिए नौसैनिक वर्ग का उपयोग किया जाता है ..."
  4. " ArrayListकार्यात्मक रूप से अनुकरणीय है List<object>"
  5. "परावर्तन एक नौसिखिया के साथ आसान ArrayListहै List<object>"

निष्कर्ष?

कोई सामान्य नहीं है OrderedDictionaryक्योंकि यह अंतर्निहित निर्माण एक (अनौपचारिक) मूल्यह्रास वर्ग है जिसका कोई सामान्य संस्करण नहीं है।


4
यह वास्तव में सवाल का जवाब नहीं देता है। एक सामान्य क्रमबद्धता स्पष्ट रूप से एक सामान्य शब्दकोश और एक सामान्य सूची पर बनाई जा सकती है।
जैक्सबी

वर्ग उपयोग का एक उदाहरण है अगर यूआई नहीं बदलता है जो कार्यान्वयन के बारे में परवाह करता है? खैर, भाषा डिजाइन / संकलक टीम, मान लें कि, अपने गैर-सामान्य समकक्ष को प्राप्त करने वाले जेनेरिक को पसंद कर सकती है । मेरी छिटपुट समझदारी। शुरुआत के लिए: क्या भिन्न (तत्काल) पूर्वजों को एक भूमि खदान है जो कहीं न कहींOrderedDictionary सहकारिता और गर्भपात विचरण के विकासवादी रास्ते में है ?
राडारबॉब

15

OrderedDictionaryभार के अनुक्रमण आपरेशन तो एक पूर्णांक के साथ कि अनुक्रमण Nस्थिति में आइटम मिल जाएगा N, जबकि एक साथ का अनुक्रमण Objectआइटम उस वस्तु को coresponding प्राप्त हो सकें। यदि किसी को उस क्रम में एक OrderedDictionary<int, string>बुलाया myDict, और जोड़े गए आइटम (1, "जॉर्ज") और (0, "फ्रेड") बनाने थे, तो myDict[0]"जॉर्ज" या "फ्रेड" वापस करना चाहिए ?

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

अगर क्लास को सीएलएस का अनुपालन नहीं करना था, लेकिन केवल vb.net के साथ काम करना था, तो एक समझदार डिज़ाइन का उपयोग अनुक्रमित गुणों के नाम से किया जा सकता था। इस प्रकार, ऊपर के उदाहरण में, myDict.ByKey[0]"फ्रेड" की myDict.BySequence[0]उपज होगी , और "जॉर्ज" की उपज होगी। दुर्भाग्य से, सी # जैसी भाषाएं अनुक्रमित गुणों के नाम का समर्थन नहीं करती हैं। हालांकि इस तरह के गुणों के बिना भी उपर्युक्त वाक्यविन्यास के उपयोग की अनुमति देने के लिए कुछ को खारिज किया जा सकता है, लेकिन इस तरह की संरचनाओं के क्षेत्र को लपेटने का दुर्भाग्यपूर्ण निर्णय Pointऔर Rectangleइसका मतलब है कि myDict.ByKey[0] = "Wally"काम करने के लिए, myDict.ByKeyएक नया वर्ग ऑब्जेक्ट वापस करना होगा। एक संरचना अधिक कुशल होगी, लेकिन संकलक अस्वीकार कर देगा कि क्या लिखा है केवल पढ़ने के लिए एक संरचना की तरह (इसके बावजूद कि संपत्ति द्वारा संशोधित संरचना को संशोधित नहीं किया जाएगा)ByKey, लेकिन इसके बजाय उस संग्रह को संशोधित करें, जिसमें यह एक संदर्भ रखता है)।

व्यक्तिगत रूप से, मुझे लगता है कि एक डिक्शनरी-ईश ऑब्जेक्ट को निर्दिष्ट किया गया था जो प्रविष्टि क्रम का ट्रैक रखने के लिए एक अच्छी बात होगी; मुझे एक डिक्शनरी-ईश ऑब्जेक्ट भी चाहिए जो किसी विशेष कुंजी से जुड़ी कुंजी को आसानी से लौटा सके (ताकि, उदाहरण के लिए यदि किसी के पास केस-इनसेटिव डिक्शनरी है और उसने "जॉर्ज" की कुंजी के साथ एक रिकॉर्ड जोड़ा है, तो एक डिक्शनरी से पूछ सकते हैं कि "जॉर्ज" के साथ कौन सी कुंजी जुड़ी KeyValuePairहुई है, जो किसी एन्यूमरेशन में दी गई सभी वस्तुओं को खोजे बिना है ।


3

क्योंकि ऑर्डर बनाए रखने से O (1) लुकअप को रोकता है, जब तक कि आप दो संग्रह (ऑर्डर के लिए एक, लुकअप के लिए एक) को नहीं लपेटते हैं, जो कि कम प्रदर्शन करता है / हटाता है और मेमोरी उपयोग को बढ़ाता है। या आप कम मेमोरी उपयोग के बदले में धीमी लुकअप कर सकते हैं।

मेरा अनुमान है कि यहाँ कोई 'स्पष्ट रूप से बेहतर' विकल्प नहीं था, इसलिए यह मानक पुस्तकालय में नहीं गया। विशेष रूप से 2.0 के आसपास, C # अभी भी जावा की गलतियों से सीख रहा था। मुझे आश्चर्य नहीं होगा अगर जावा की 'सब कुछ और रसोई की सिंक' के मानक पुस्तकालय में संग्रह के लिए दृष्टिकोण को कुछ के रूप में अच्छी तरह से बचने के लिए देखा गया था।


1
कम स्मृति के बदले में धीमी लुक-अप होने से प्रभावी रूप से OrderedDictionaryList। मुझे लगता है कि किसी के लिए एक वैध उपयोग के मामले के साथ एक OrderedDictionaryविशेष रूप से उपयोग कर रहा है क्योंकि वे एक संग्रह वर्ग है कि ओ (1) देखने की जरूरत है, लेकिन यह भी प्रविष्टि आदेश याद है, जो अतिरिक्त स्मृति का उपयोग कर मामले में अपरिहार्य और इस तरह स्वीकार्य है।
Abion47
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.