2011-09-22 17 views
9

मेरे पास एक कुंजीपटल संरचना है, जिसमें कई महत्वपूर्ण मूल्य जोड़े हैं।शब्दकोश में पहला तत्व के रूप में कैसे सम्मिलित करें?

myDict.Add(key1, value1); 
myDict.Add(key2, value2); 
myDict.Add(key3, value3); 

मेरे शब्दकोश कुछ नियंत्रण के लिए एक डेटा स्रोत के रूप में इस्तेमाल किया जाता है। नियंत्रण के ड्रॉपडाउन में मैं देखता हूं कि आइटम इस तरह हैं:

key1 
key2 
key3 

ऑर्डर मेरे शब्दकोश के समान दिखता है। मुझे पता है कि शब्दकोश सरणी की तरह नहीं है - आप इंडेक्स या तो प्राप्त कर सकते हैं। मैं sortedDictionary का उपयोग नहीं कर सकता। अब मैं अपने कार्यक्रम के कुछ बिंदु पर इस शब्दकोश के लिए एक और महत्वपूर्ण मूल्य जोड़ी जोड़ने की जरूरत है और मुझे आशा है कि यह एक ही प्रभाव पड़ता है के रूप में मैं यह कर:

myDict.Add(newKey, newValue); 
myDict.Add(key1, value1); 
myDict.Add(key2, value2); 
myDict.Add(key3, value3); 

मैं ऐसा करते हैं, मुझे पता है newKey प्रदर्शित करेगा पहले तत्व के रूप में मेरे नियंत्रण में।

मैं एक tempDict बनाने के लिए tempDict को myDict में प्रत्येक जोड़ी डाल एक विचार है, तो स्पष्ट myDict, तो जोड़े वापस इस तरह जोड़ें:

myDict.Add(newKey, newValue); 
myDict.Add(key1, value1); 
myDict.Add(key2, value2); 
myDict.Add(key3, value3); 

इससे बेहतर तरीका है?

धन्यवाद!

उत्तर

19

Dictionary<K,V> में ऑर्डरिंग नहीं है। किसी भी कथित आदेश रखरखाव मौके से है (और एक विशेष कार्यान्वयन का एक आर्टिफैक्ट, बाल्टी चयन आदेश और गिनती सहित, लेकिन इतनी ही सीमित नहीं है)।

इन तरीकों (बस Base Class Libraries BCL का प्रयोग करके) कर रहे हैं मुझे पता है के बारे में:

  1. Lookup<K,V>
    • .NET4, अपरिवर्तनीय, एक से अधिक मान के लिए कुंजी (डुप्लिकेट के लिए घड़ी के निर्माण के दौरान) मैप कर सकते हैं
  2. OrderedDictionary
    • पुराना, गैर सामान्य, उम्मीद शब्दकोश कामकाज mance सीमा
  3. List<KeyValuePair<K,V>>
    • .NET2/3 ठीक है, परिवर्तनशील है, और अधिक शेष काम, एक से अधिक मान के लिए कुंजी मैप कर सकते हैं (अन्य दो दृष्टिकोण "मिल (key)/सेट (key)" के लिए O(n) कर रहे हैं) (आवेषण में डुप्लिकेट के लिए घड़ी)

मुबारक कोडिंग।


एक हैश डेटा संरचना है कि प्रविष्टि व्यवस्था को बनाए रखता है वास्तव में केवल एक मानक हैश कार्यान्वयन के एक मामूली संशोधन (रूबी अब प्रविष्टि व्यवस्था बनाए रखने के हैश) बनाया जा रहा है; हालांकि, यह .NET में नहीं किया गया था और न ही, सबसे महत्वपूर्ण बात यह है कि यह शब्दकोश/आईडीकेआर अनुबंध का हिस्सा है।

+0

लुकअप पर "घड़ी आवेषण" से आपका क्या मतलब है? क्या आपका मतलब है कि किसी लुकअप में मान डालने पर सावधान रहना चाहिए? यदि ऐसा है, तो यह सच नहीं है, क्योंकि लुकअप अपरिवर्तनीय है। – phoog

+0

@phoog चूंकि यह * एकाधिक मानों के लिए एक कुंजी को संभाल सकता है, इसलिए एक शब्दकोश के साथ संभव परिस्थितियों का नेतृत्व करना संभव नहीं है। शब्द आदर्श नहीं था। इस उत्कृष्ट उत्तर –

+0

+1 लेकिन मेरे नियंत्रण को डेटा स्रोत फ़ीड करने के लिए शब्दकोश की आवश्यकता है और हम नियंत्रण को बदलना नहीं चाहते हैं। –

1

एक शब्दकोश का उपयोग न करें - कोई गारंटी नहीं है कि जब आप और तत्व जोड़ते हैं तो कुंजी का क्रम नहीं बदलेगा।इसके बजाय, अपने कुंजी-मूल्य-जोड़े के लिए Pair कक्षा को परिभाषित करें (उदाहरण के लिए What is C# analog of C++ std::pair? देखें) और अपने डेटा स्रोत के लिए List<Pair> का उपयोग करें। List में Insert ऑपरेशन है जिसका उपयोग आप अपनी सूची में कहीं भी नए तत्व डालने के लिए कर सकते हैं।

+0

के लिए – spspli

+1

@ एसपीएसप्ली: अच्छा डॉक्टर क्या कह रहा है कि आपको 'डिक्शनरी ' की मूल बातें अनदेखा नहीं करना है। तो या तो आप अपनी डेटा संरचना बदलते हैं या आप एक अनियंत्रित संग्रह के साथ रहते हैं। – user7116

+3

जब आप अपने नियंत्रण को विशिष्ट, सूची-जैसी क्रम में तत्व प्रदर्शित करने के लिए चाहते हैं, और केवल स्वीकृत डेटासोर्स एक शब्दकोश है - जो एक विशिष्ट आदेश प्रदान नहीं करता है - तो आपका नियंत्रण गलत डिज़ाइन किया गया है और आप अपने लिए समाधान ढूंढने की उम्मीद नहीं कर सकते मुसीबत। तो या तो आप अपना नियंत्रण बदलते हैं, एक अलग नियंत्रण का उपयोग करते हैं या अपने नियंत्रण के बारे में अधिक जानकारी प्राप्त करते हैं यदि ऑर्डरिंग जानकारी कहीं से बाहर होने का वैकल्पिक तरीका है। –

2
शब्दकोश पर

MSDN पृष्ठ (TKey, TValue):

गणन के प्रयोजनों के लिए शब्दकोश में प्रत्येक आइटम एक KeyValuePair < के रूप में व्यवहार किया जाता है (के < (TKey, TValue>)>) संरचना एक मूल्य और इसकी कुंजी का प्रतिनिधित्व करते हैं। जिस क्रम में वस्तुओं को वापस किया जाता है वह अनिर्धारित है।

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

5

आप Dictionary कक्षा के साथ ऐसा नहीं कर सकते हैं। डेटा संरचना को लागू करने के तरीके में एक क्विर्क की वजह से यह आपके उदाहरण में काम कर रहा है। डेटा संरचना वास्तव में एक सरणी में अस्थायी क्रम में प्रविष्टियों को संग्रहीत करती है और फिर एंट्री सरणी में अनुक्रमणिका के लिए एक और सरणी का उपयोग करती है। गणना प्रविष्टि सरणी पर आधारित हैं। यही कारण है कि ऐसा लगता है कि आपके मामले में आदेश दिया गया है। लेकिन, अगर आप हटाने और सम्मिलन संचालन की एक श्रृंखला लागू करते हैं तो आप देखेंगे कि यह आदेश परेशान हो जाता है।

इसके बजाय KeyCollection का उपयोग करें। यह ओ (1) दोनों कुंजी और सूचकांक द्वारा पुनर्प्राप्ति प्रदान करता है और अस्थायी क्रम को संरक्षित करता है।

+0

+1 इच्छा है कि मैं पहले कुंजीकोलेक्शन के बारे में जानता था (लेकिन यह घटक मॉडेल नेमस्पेस में क्यों बंद है और यह विस्तारित होने पर भरोसा क्यों करता है?: - /) –

+0

@pst: मुझे नहीं पता ... अच्छा सवाल है। –

+0

+1 [कीडकोलेक्शन] (http://msdn.microsoft.com/en-us/library/ms132438.aspx) बस वही है जो मैं ढूंढ रहा था! – Ben

1

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

यदि आप शब्दकोश का विस्तार करते हैं, तो ऐसा कोई नियम नहीं है जो आपकी सूची को मिश्रण करने से रोक देगा।

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