2012-11-11 11 views
5

मैं निम्नलिखित प्रकार का एक शब्दकोश का निर्माण करना चाहते में नेस्टेड शब्दकोश,बनाना तीन स्तर सी #

var data = new Dictionary<string, Dictionary<string, Dictionary<string, int>>>(); 

जब मैं निम्नलिखित तरीके से शब्दकोश में मूल्य जोड़ने की कोशिश, मैं एक KeyNotFound अपवाद मिलता है।

data[key1][key2][key3]= 3; 

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

अन्यथा रनटाइम पर कुंजी जोड़ने का कोई तरीका है?

मैं निम्नलिखित प्रकार के उत्पादन की उम्मीद:

[male,[animal,[legs,4] 

       [eyes,2]] 
     [human,[hands,2] 
       [ears,2]] 

[female,[animal,[nose,1] 

       [eyes,2]] 
     [bird,[wings,2] 
       [legs,2]] 
+1

हालांकि तकनीकी कारणों से आपने ऐसा क्यों can'd नहीं हैं। मैं आपके द्वारा बनाए रखने के लिए किसी भी चीज में डेटा संरचना को रखने के खिलाफ अत्यधिक अनुशंसा करता हूं। कक्षाओं में प्रतिनिधित्व करने की कोशिश कर रहे हैं तो इसे तोड़ दें और इसे बनाए रखना आसान होगा। मैं समझता हूं कि यह आसान लगता है लेकिन आपके पास कोई अर्थपूर्ण अर्थ नहीं है कि प्रत्येक कुंजी और मूल्य क्या दर्शाता है और इससे आपको सिरदर्द हो जाएगा। –

उत्तर

6

समस्या यहाँ है कि आप केवल अंतरतम शब्दकोश में आवंटित करने के लिए कोशिश कर रहे हैं। लेकिन दो बाहरी स्तर मौजूद नहीं हैं।

आप प्रत्येक स्तर के बारे में स्पष्ट होने की जरूरत:

if (!data.ContainsKey(key1)) 
    data[key1] = new Dictionary<string, Dictionary<string, int>(); 

... और इतने पर। यह लिखने के लिए थोड़ा बोझिल हो सकता है, इसलिए यदि आपको इसकी बहुत आवश्यकता है, तो मेरा सुझाव है कि आप शब्दकोश पर एक विस्तार विधि बनाएं जिससे आप इसे आसानी से कर सकें।

यदि आप किसी शब्दकोश में कुंजी को असाइन करते हैं, तो वह प्रविष्टि बनाई जाती है। लेकिन यदि आप किसी शब्दकोश में एक कुंजी से पढ़ते हैं, और वह कुंजी मौजूद नहीं है, तो आपको अपवाद मिलता है।

+0

+1! मुझे नहीं पता था कि एक कुंजी असाइन करना स्वचालित रूप से एक प्रविष्टि बनाता है! – GETah

0

आप केवल 1 स्तर शब्दकोश घोषित, जब आप हर स्तर घोषित करने के लिए की जरूरत है:

var data = new Dictionary<string, new Dictionary<string, new Dictionary<string, int>>>(); 

आशा यह आप में मदद मिलेगी।

0

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

इस प्रयास करें:

data["male"] = new[] { 
       {"animal", new[] { 
           {"legs",4}, 
           {"eyes", 2} 
          }, 
       {"human", new[] { 
          {"hands", 2} 
       } 
       }; 

मैं यहाँ एक संकलक की जरूरत नहीं है, इसलिए, मुझे यकीन है कि यह काम करेंगे नहीं हूँ।

2

अपने प्रमुख वितरण में निर्भर करता है और यह आसान हो सकता है प्रविष्टियों की संख्या का उपयोग करने के लिए एक कुंजी के रूप में Tuple<string, string, string>:

var data = new Dictionary<Tuple<string, string, string>, int>(); 
data[Tuple.Create("key1", "key2", "key3")] = 1; 
var itemFromDictionary = data[Tuple.Create("key1", "key2", "key3")]; 
संबंधित मुद्दे