2010-06-18 15 views
6

क्या .NET में कोई संग्रह है जो KeyValuePair<string, string> को संग्रहीत करने की अनुमति देता है जो डालने का क्रम रखता है?
OrderedDictionary आशाजनक लग रहा था, लेकिन लगता है कि इसकी कमी है।
अब मैं IOrderedEnumerable> में देख रहा हूं, लेकिन मुझे ISortedDictionary को छोड़कर कोई कार्यान्वयन नहीं दिख रहा है, लेकिन यह वही नहीं है जो मैं चाहता हूं। कोई सॉर्टिंग करने की आवश्यकता नहीं है, केवल डालने का क्रम महत्वपूर्ण है।Keyvaluepairs की आदेश दिया?

अद्यतन
कारण मैं OrderedDictionary पसंद नहीं है कि यह सामान्य नहीं है।

+0

OrderedDictionary मूल्यों को सॉर्ट नहीं कर रहा है और आप इंडेक्स द्वारा तत्वों तक पहुंच सकते हैं। वास्तव में क्या कमी है? –

+0

'OrderedDictionary' का उद्देश्य आप जो खोज रहे हैं उसके लिए है, दुर्भाग्यवश यह सामान्य नहीं है। इसके अलावा, क्या इसमें कुछ और याद आ रही है जिसे आप ढूंढ रहे हैं? यदि आप जो खोज रहे हैं उसे स्पष्ट कर सकते हैं (और क्यों निर्मित कक्षाएं आपकी आवश्यकताओं को पूरा नहीं करती हैं) आपको बेहतर उत्तर मिलेगा। – LBushkin

+0

यदि संभव हो तो मैं सभी कास्टिंग से बचाना चाहूंगा। –

उत्तर

7

OrderedDictionary आप आइटम करने के लिए दोनों बंद और सम्मिलन-अनुक्रम का उपयोग की जरूरत है तुम क्या चाहते है ... यह वास्तव में सिर्फ हैश टेबल और एक सूची का संयोजन है। यह प्रविष्टि सूचकांक या कुंजी द्वारा आइटमों तक पहुंचने का माध्यम प्रदान करता है। यह .NET में एकमात्र संग्रह है जो यह करता है। अफसोस की बात है, यह सामान्य नहीं है।

यदि OrderedDictionary आपकी आवश्यकताओं को पूरी तरह से पूरा नहीं करता है क्योंकि यह सामान्य नहीं है - तो आप the version here that provides a generic equivalent का उपयोग कर सकते हैं। यदि अन्य कारण हैं कि यह आपके लिए क्यों काम नहीं करता है, तो अपनी पोस्ट अपडेट करें और हम एक बेहतर विकल्प की तलाश कर सकते हैं।

जबकि आप निश्चित रूप से अपना खुद का List<KeyValuePair<string,string>> बना सकते हैं तो आप कुंजी कुशलतापूर्वक खोज करके विकल्प खो देंगे। अब, आप निश्चित रूप से एक आदेशित डिक्शनरी के अपने कार्यान्वयन को रोल कर सकते हैं जो एक साथ संयुक्त सूची/निर्देश ... लेकिन जिस पोस्ट से मैंने लिंक किया है वह पहले से ही करता है।

+0

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

7

बस List<KeyValuePair<T,T>> का उपयोग करें। वे सम्मिलन के क्रम में संग्रहित हैं। हर बार जब आप इसे जोड़ते हैं, तो नवीनतम सूची को सूची के अंत में जोड़ा जाता है।

तो

var list = new List<KeyValuePair<String,String>>(); 

list.Add(new KeyValuePair<String,String>("","")); 

आप क्रम में उन्हें बाहर निकलने के लिए चाहते हैं, बस का उपयोग करें:

list.ForEach(x=>...); 

या

foreach(var item in list){ 
...} 
+0

क्या यह गारंटी है कि सूची इसे ऑर्डर देती है? –

+1

हां, ऐसा करना है, क्योंकि आप सरणी सूची [0] .. आदि जैसे तत्वों को सीधे एक्सेस कर सकते हैं। – kemiller2002

3

आप एक Queue<T> जहां टी का उपयोग कर एक रोल करना चाह सकते हैं एक KeyValuePair<string, string> है। यह एक और ठोस अनुबंध है जो स्पष्ट रूप से सम्मिलन आदेश की गारंटी देता है।

http://msdn.microsoft.com/en-us/library/7977ey2c.aspx

0

तुम सिर्फ एक List<KeyValuePair<string,string>> उपयोग करने के लिए सक्षम होना चाहिए। मैं वास्तव में MSDN प्रलेखीकरण करते हुए कहा कि प्रविष्टि आदेश की गारंटी है में पा सकते हैं नहीं है, लेकिन यह एक बहुत सुरक्षित शर्त है ...

6

हालांकि मुझे गेम के लिए देर हो चुकी है, .NET Framework 4.5 आपके लिए नई कक्षाएं प्रदान करता है। SortedList<TKey, TValue> या SortedDictionary<TKey, TValue> देखें। यदि आप सोच रहे हैं कि आपको किस का उपयोग करना चाहिए, तो एमएसडीएन कुछ अच्छे कारण प्रदान करता है कि आप एक दूसरे को क्यों चुन सकते हैं।

सॉर्टेडलिस्ट जेनेरिक क्लास ओ (लॉग एन) पुनर्प्राप्ति के साथ कुंजी/मूल्य जोड़े की एक सरणी है, जहां एन शब्दकोश में तत्वों की संख्या है। इसमें, यह SortedDictionary जेनेरिक क्लास के समान है। दोनों वर्गों में समान ऑब्जेक्ट मॉडल होते हैं, और दोनों में ओ (लॉग एन) पुनर्प्राप्ति होती है।कहाँ दो वर्गों अलग स्मृति का उपयोग करें और प्रविष्टि और हटाने की गति में है:

  • SortedList<TKey, TValue>SortedDictionary<TKey, TValue> से कम स्मृति का उपयोग करता है।
  • SortedDictionary<TKey, TValue> में SortedList<TKey, TValue> के लिए ओ (एन) के विपरीत अपरिवर्तित डेटा, ओ (लॉग एन) के लिए तेज़ सम्मिलन और निष्कासन संचालन है।
  • यदि सूची क्रमबद्ध डेटा से एक बार में पॉप्युलेट की जाती है, तो SortedList<TKey, TValue>SortedDictionary<TKey, TValue> से तेज़ है।

SortedDictionary<TKey, TValue> और SortedList<TKey, TValue> वर्गों के बीच एक और अंतर यह है कि SortedList<TKey, TValue> कुंजी द्वारा लौटाए संग्रह के माध्यम से कुंजी और मूल्यों के कुशल अनुक्रमित पुनः प्राप्ति का समर्थन करता है और गुण मान है। गुणों को पुन: उत्पन्न करना आवश्यक नहीं है जब गुणों का उपयोग किया जाता है, क्योंकि सूचियां कुंजी और मानों के आंतरिक सरणी के लिए केवल रैपर हैं।

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

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