2011-03-02 13 views
8

मैं Dictionary जैसे सामान्य संग्रह का उपयोग करना चाहता हूं, लेकिन Dictionary आवश्यक है कि प्रत्येक कुंजी अद्वितीय हो। मेरे पास एक ही "कुंजी" के लिए कई मान हैं, इसलिए मुझे एक सामान्य संग्रह की आवश्यकता है जो इसके लिए अनुमति देगा।क्या एक कुंजी/मूल्य जोड़ी वाला एक सामान्य संग्रह है जहां कुंजी एक से अधिक बार हो सकती है?

मुझे एहसास है कि यह कुंजी अब वास्तव में एक कुंजी नहीं है, लेकिन मुझे नहीं पता कि इसे और कहां कॉल करना है।

+1

किसी को कौन परवाह करता है, मैं बस के लिए एक संदर्भ सहित समाप्त हो गया के लिए मूल्य मैं मूल्य वस्तु के अंदर ट्रैक करना चाहता था। तब मैंने सिर्फ एक सूची का उपयोग किया और मेरे ऑब्जेक्ट में प्रोपेरी के माध्यम से मूल्य तक पहुंचने में सक्षम था। प्रत्येक उत्तर देने वाले का धन्यवाद। मैं इस जानकारी का उपयोग भविष्य में उपयोग के लिए करूँगा। – richard

+0

संभावित डुप्लिकेट [.NET शब्दकोशों में डुप्लिकेट कुंजी?] (Http://stackoverflow.com/questions/146204/duplicate-keys-in-net- शब्दकोश) – nawfal

उत्तर

16

कई विकल्पों पर विचार करने के लिए के लिए: उस शब्द के लिए एक त्वरित खोज इस संबंधित सवाल का पता चला

  • एक Dictionary<TKey, List<TValue>> का उपयोग करें - प्रत्येक के लिए मानों की एक सूची रखने कुंजी, एक ही कुंजी (यानी डुप्लिकेट जोड़े) के लिए डुप्लिकेट मानों को रोक नहीं रहा है;
  • Dictionary<TKey, HashSet<TValue>> का उपयोग करें - प्रत्येक कुंजी के लिए सेट करें, उसी कुंजी के लिए डुप्लिकेट मान को रोकना;
  • List<KeyValuePair<TKey, TValue>> का उपयोग करें - जोड़ी की एक सूची रखें, उसी कुंजी के लिए डुप्लिकेट मानों को रोक नहीं रहा है।

ध्यान दें कि बाद के मामले में KeyValuePair एक struct, नहीं एक class, इसलिए कि कुछ अलग से निपटने का तात्पर्य है।

सही विकल्प आपके वास्तविक उपयोग मामले पर निर्भर करता है।

+0

मुझे लगता है कि आपका दूसरा सुझाव मुझे सबसे ज्यादा समझ में आता है। यह मुझे चाबियों को फिर से चलाने और मूल्यों को प्राप्त करने की अनुमति देगा, लेकिन संग्रह में अद्वितीय होने के लिए कुंजी की आवश्यकता नहीं होगी। क्या वो सही है? – richard

+0

हाँ, यह सही है। यह भी ध्यान रखें कि यह डुप्लिकेट जोड़े को संग्रहीत करने से नहीं रोकेगा। यदि यह चिंता का विषय है, तो 'हैशसेट' के साथ पहला दृष्टिकोण बेहतर होगा। (कवर करने के लिए मेरा जवाब संपादित किया।) –

+1

अच्छा जवाब! :-) –

0

Dictionary<KeyType,List<ValueType>> आज़माएं।

आप एक कस्टम शब्दकोश बना सकते हैं जो जोड़ने और हटाने पर सभी आवश्यक तर्कों को संभालने के लिए इस शब्दकोश को लपेटता है।

+0

शब्दकोश को अद्वितीय होने के लिए _KeyType_ की आवश्यकता होगी। मैं एक से अधिक बार कुंजी के लिए एक ही मान का उपयोग करना चाहता हूं। – richard

2

आप Dictionary<TKey,List<TValue>> बना सकते हैं और मैन्युअल कार्य स्वयं कर सकते हैं, लेकिन डिफ़ॉल्ट रूप से कोई "बहु-शब्दकोश" संग्रह नहीं है।

यह कहा गया है कि, यदि आपके पास एक आईनेमरेबल है तो आप इसे एक लुकअप में बदल सकते हैं जो आपके द्वारा वर्णित जैसा है, लेकिन स्वयं द्वारा निर्मित नहीं किया जा सकता है (गणना से बनाने के लिए ToLookup() को कॉल करना होगा)।

0

अपने मूल्य के लिए, आप जो कुछ भी रखना चाहते हैं उसकी एक सूची स्टोर कर सकते हैं।

4

सी ++ में, इस तरह के संग्रह को मल्टीमैप कहा जाता है।

multimap in .NET

8

.NET 3.5 और ऊपर, यह ILookup<TKey,TValue> है। दुर्भाग्य से केवल प्रदान किया गया कार्यान्वयन अपरिवर्तनीय Lookup<TKey,TValue> है, हालांकि इसे फिर से कार्यान्वित करना आसान है। MiscUtil में शामिल है।

एक ILookup<TKey,TValue> के साथ, TKey इंडेक्सर रिटर्न एक IEnumerable<TValue>, इसलिए विशिष्ट उपयोग है (यहां तक ​​कि अगर वहाँ है कि कुंजी के लिए कोई मेल नहीं थे):

foreach(var value in lookup[key]) 
    DoSomethingWith(value); 
संबंधित मुद्दे