कुंजी मूल्य जोड़े डेटा संरचना के लिए सबसे अच्छा कार्यान्वयन?

तो मैं हाल ही में थोड़ा सा सी # के साथ घूम रहा हूं, और सभी जेनेरिक संग्रहों में मुझे थोड़ा उलझन में है। मान लें कि मैं एक डेटा संरचना का प्रतिनिधित्व करना चाहता था जहां पेड़ का सिर एक महत्वपूर्ण मूल्य जोड़ी था, और फिर नीचे के प्रमुख मूल्य जोड़े की एक वैकल्पिक सूची है (लेकिन इनके अलावा कोई और स्तर नहीं)। क्या यह उपयुक्त होगा?

public class TokenTree
{
    public TokenTree()
    {
        /* I must admit to not fully understanding this,
         * I got it from msdn. As far as I can tell, IDictionary is an
         * interface, and Dictionary is the default implementation of
         * that interface, right?
         */
        SubPairs = new Dictionary();
    }

    public string Key;
    public string Value;
    public IDictionary SubPairs;
}

डेटा के चारों ओर गुजरने के लिए यह वास्तव में एक साधारण शंट है।

0
ro fr bn

8 उत्तर

KeyValuePair नामक एक वास्तविक डेटा प्रकार है, इस तरह उपयोग करें

KeyValuePair myKeyValuePair = new KeyValuePair("defaultkey", "defaultvalue");
0
जोड़ा
KeyValuePair NAME_HERE = new KeyValuePair ("defaultkey", "defaultvalue");
जोड़ा लेखक HasanAboShally, स्रोत
कुछ टाइपिंग को बचाने और सबकुछ स्पष्ट करने के लिए यह "उपयोग" कथन (पुराने टाइपपीफ के समान) के साथ बहुत अच्छा काम करता है। यदि आप लगातार ई का उपयोग करते हैं। जी। (स्ट्रिंग, स्ट्रिंग) जोड़ी।
जोड़ा लेखक Andreas Reiff, स्रोत
@AndreasReiff की टिप्पणी पर विस्तार करने के लिए: NameValuePair = System.Collections.Generic.KeyValuePair ; प्रत्येक फ़ाइल के शीर्ष के पास (string, string) </कोड> संरचना। हालांकि मुझे अपने नेमस्पेस में class nameValuePair बनाने के लिए और अधिक सुविधाजनक लगता है: पब्लिक क्लास NameValuePair {KeyValuePair it; सार्वजनिक नामValuePair (स्ट्रिंग नाम, स्ट्रिंग मान) {it = new KeyValuePair (नाम, मान); } सार्वजनिक स्ट्रिंग नाम {प्राप्त करें {इसे वापस करें। के; }} सार्वजनिक स्ट्रिंग वैल्यू {प्राप्त करें {इसे वापस क
जोड़ा लेखक ToolmakerSteve, स्रोत

एक संभावित चीज जो आप कर सकते हैं, सीधे बॉक्स के बाहर डिक्शनरी ऑब्जेक्ट का उपयोग करें और फिर इसे अपने स्वयं के संशोधनों के साथ बढ़ाएं:

public class TokenTree : Dictionary
{
    public IDictionary SubPairs;
}

यह आपको अपनी कुंजी (जैसे, कुंजी विशिष्टता, आदि) के लिए IDictionary के नियमों को लागू करने के लिए नहीं की लाभ देता है।

और हाँ आपको कन्स्ट्रक्टर की अवधारणा मिल गई है :)

0
जोड़ा

एक keyValuePair अंतर्निहित प्रकार है। वास्तव में, यह वही है जो IDictionary आपको उस समय तक पहुंच प्रदान कर रहा है जब आप इसमें पुन: प्रयास करते हैं।

इसके अलावा, यह संरचना शायद ही एक पेड़ है, अधिक प्रतिनिधि नाम ढूंढना एक अच्छा अभ्यास हो सकता है।

0
जोड़ा

Dictionary Class is exactly what you want, correct.

आप IDictionary के बजाए सीधे फ़ील्ड के रूप में फ़ील्ड घोषित कर सकते हैं, लेकिन यह आपके ऊपर है।

0
जोड़ा

@ जय मूनी : .NET में एक सामान्य शब्दकोश वर्ग वास्तव में निश्चित प्रकार के साथ हैश तालिका है।

आपके द्वारा दिखाए गए कोड को किसी को भी शब्दकोश के बजाय हैशटेबल का उपयोग करने के लिए मनाया जाना चाहिए, क्योंकि दोनों कोड टुकड़ों को दोनों प्रकार के लिए उपयोग किया जा सकता है।

हैशटेबल के लिए:

foreach(object key in h.keys)
{
     string keyAsString = key.ToString();//btw, this is unnecessary
     string valAsString = h[key].ToString();

     System.Diagnostics.Debug.WriteLine(keyAsString + " " + valAsString);
}

शब्दकोश के लिए:

foreach(string key in d.keys)
{
     string valAsString = d[key].ToString();

     System.Diagnostics.Debug.WriteLine(key + " " + valAsString);
}

और KeyValuePair के साथ दूसरे के लिए वही, बस हैशटेबल के लिए गैर-जेनेरिक संस्करण और शब्दकोश के लिए सामान्य संस्करण का उपयोग करें।

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

0
जोड़ा

इस तरह कुछ प्रयोग करें:

class Tree < T > : Dictionary < T, IList< Tree < T > > >  
{  
}  

यह बदसूरत है, लेकिन मुझे लगता है कि यह आपको वह देगा जो आप चाहते हैं। बहुत खराब KeyValuePair सील कर दिया गया है।

0
जोड़ा

इसमें जोड़ने के लिए सिर्फ एक चीज (हालांकि मुझे लगता है कि आपके पास पहले से ही आपका प्रश्न दूसरों द्वारा उत्तर दिया गया है)। विस्तारशीलता के हित में (क्योंकि हम सभी जानते हैं कि यह किसी बिंदु पर होगा) आप समग्र पैटर्न यह" पेड़ की तरह संरचनाओं "के साथ काम करने के लिए आदर्श है ..

जैसे मैंने कहा, मुझे पता है कि आप केवल एक उप-स्तर की उम्मीद कर रहे हैं, लेकिन यदि आप बाद में ^ _ ^ को विस्तारित करने की आवश्यकता है तो यह वास्तव में आपके लिए उपयोगी हो सकता है

0
जोड़ा

मुझे लगता है कि आप क्या कर सकते हैं (आपके प्रश्न के शाब्दिक कार्यान्वयन के रूप में), है:

public class TokenTree
{
    public TokenTree()
    {
        tree = new Dictionary>();
    }

    IDictionary> tree; 
}

आपने वास्तव में अपने प्रश्न में महत्वपूर्ण मूल्यों की "सूची" कहा था, इसलिए आप आंतरिक IDictionary को एक साथ स्वैप करना चाहेंगे:

IList>
0
जोड़ा