2013-06-05 14 views
5

मैं इस तरह एक नेस्ट शब्दकोश संरचना है:कैसे एक foreach पाश में एक नेस्टेड शब्दकोश <> वस्तुओं का उपयोग करने के लिए

Dictionary<string, Dictionary<string, string>> dict; 

मैं दो foreach छोरों का उपयोग कर तत्वों का उपयोग करने की कोशिश कर रहा हूँ, लेकिन संकलक नहीं होगा मुझे मेरे भीतर के पाश के लिए पाश चर के रूप में निम्नलिखित का उपयोग करते हैं:

Dictionary<string, string> 

यह है कि मैं क्या है:

foreach (string key in dict.Keys) { 
    foreach (Dictionary<string, string> innerDict in dict[key]) { 
     // ... 
    } 
} 

संकलक का कहना है:

Cannot convert type 'System.Collections.Generic.KeyValuePair<string,string>' 
to 'System.Collections.Generic.Dictionary<string,string>' 

मैं भीतरी पाश में KeyValuePair < स्ट्रिंग, स्ट्रिंग> उपयोग कर सकते हैं, लेकिन इतना है कि मैं इस तरह कुछ कर सकते हैं मैं (एक पूरे के रूप वस्तु ही शब्दकोश का उपयोग करना चाहते हैं: अगर (dict.ContainsKey (innerDict)) {...})

उत्तर

1

ऐसा इसलिए है क्योंकि string कुंजी का मान एक सूची नहीं है। यदि आप यही चाहते हैं तो Dictionary से Dictionary<string, List<Dictionary<string, string>>> dict; की घोषणा बदलें।

या आप सिर्फ पहली foreach पाश इस तरह के अंदर शब्दकोश हड़पने सकता है:

Dictionary<string, string> val = dict[key]; 

और वहां से इसका इस्तेमाल करते हैं। लेकिन किसी भी तरह से, आप कुछ ऐसी चीज के खिलाफ पुनरावृत्ति करने की कोशिश कर रहे हैं जो गणना योग्य नहीं है।

मुझे लगता है कि आपके पास Dictionary परिभाषित हो सकता है जैसा कि आप चाहते हैं - आपको बस आंतरिक लूप की आवश्यकता नहीं है।

+0

है यही कारण है कि मैं पहले से ही है हल कर सकते हैं। – user2455816

+0

यह वही कोड है जो ओपी पहले से ही है। – Renan

+0

@Ted, क्षमा करें, मैंने प्रश्न देखा जब मैंने '< 'चरित्र देखा। –

5

न्यूनतम कोड परिवर्तन यह इस तरह है ठीक करने के लिए (लेकिन इस जवाब में अगले कोड स्निपेट में सही दृष्टिकोण देखें):

Dictionary<string, Dictionary<string, string>> dict; 

foreach (string key in dict.Keys) 
{ 
    foreach (var innerDict in dict[key].Select(k => k.Value)) 
    { 
    } 
} 

आपका समस्या यह है कि जब आप एक शब्दकोश से अधिक की गणना, आप प्राप्त था कुंजी/वैल्यू जोड़े का अनुक्रम। आपके मामले में, मान आंतरिक शब्दकोश था, और यह है कि जिसकी आपको आवश्यकता है।

मैं प्रत्येक कुंजी/मूल्य जोड़ी को केवल मूल्य भाग में बदलने के लिए लिंक "चयन()" ऑपरेशन का उपयोग कर रहा हूं, यानी कुंजीपटल जो कुंजी/मान जोड़ी में मान है।

हालांकि, यह प्रत्येक आंतरिक शब्दकोश को अपनी कुंजी के साथ प्राप्त करने के लिए एक लंबा हवादार और अक्षम तरीका है। यहाँ यह कैसे किया जा सकता है:

foreach (var item in dict) 
{ 
    string key = item.Key; 
    Dictionary<string, string> innerDict = item.Value; 

    // Do something with key and innerDict. 
} 

मैं यह सोचते कर रहा हूँ कि तुम बदले में प्रत्येक भीतरी शब्दकोश यात्रा करने के लिए बाहरी शब्दकोश में है कि आंतरिक शब्दकोश के प्रमुख knowning जबकि कोशिश कर रहे हैं।

ध्यान दें कि मैंने केवल item.Key और item.Value से अपने चरों को चित्रित करने के लिए स्थानीय चरों में मूल्यों की प्रतिलिपि बनाई है। आप निश्चित रूप से item.Key और item.Value का उपयोग कर सकते हैं।

आप वास्तव में केवल भीतरी शब्दकोशों खुद को (और आप प्रत्येक भीतरी शब्दकोश के लिए महत्वपूर्ण जरूरत नहीं है) चाहते हैं, तो आप सिर्फ यह इतना की तरह कर सकते हैं (जैसा कि Nuffin सुझाव):

foreach (var innerDict in dict.Values) 
{ 
    // Use inner dictionary 
} 
+0

आप _do_ को एहसास है कि एक शब्दकोश में 'मान' गुण है, जो संग्रहीत मूल्यों तक सीधे पहुंच प्रदान करता है, है ना? – Nuffin

+0

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

0

आप होगा जब भी आप केवीपी का उपयोग करते हैं, तब भी आपकी इच्छानुसार संदर्भ के लिए शब्दकोश का उच्चारण होता है। इस प्रयास करें:

foreach (var outerKVP in dict { 
    foreach (var innerKVP in dict[outerKVP.Key]) { 
     var theString = dict[outerKVP.Key][innerKVP.Key]; 
    } 
} 
0
foreach (Dictionary<string, string> innerDict in dict[key]) { 
     // ... 
    } 

यह विफल रहता है क्योंकि dict[key] एक Dictionary<string,string> है, इसलिए foreach के साथ यह गणना प्रकार KeyValuePair<string,string> के तत्वों निकलेगा।

यदि आप आंतरिक शब्दकोश तक पहुंचना चाहते हैं, तो बस ऐसा करें और फ़ोरैच लूप ड्रॉप करें।

Dictionary<string, string> innerDict = dict[key]; 
1

तुम बस यह कम रख सकता है का उपयोग करके:

foreach (Dictionary<string, string> d in dict.Values) { 
} 

यह काम करता है, संकलक से कोई शिकायत नहीं।

भी ध्यान दें कि अपने कोड क्योंकि उस संदर्भ में काम नहीं करता है, dict[key]नहीं शब्दकोशों का एक संग्रह है, लेकिन एक भी शब्दकोश है।

0

नहीं इतनी मेहनत होना चाहिए:

Dictionary<string, Dictionary<string, string>> dict = new Dictionary<string,Dictionary<string,string>>(); 

foreach (var kvp in dict) 
{ 
    var innerDict = kvp.Value; 

    foreach (var innerKvp in innerDict) 
    { 
     Console.WriteLine(kvp.Key + " " + innerKvp.Key + " " + innerKvp.Value); 
    } 
} 
1

मुझे लगता है कि आप अंतर्निहित शब्दकोश संरचना गलतफहमी कर रहे हैं।

Dictionary<string, Dictionary<string, string>> 

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

Dictionary<string,string> dictionaryObject; 
foreach (string item in dictionaryObject) 
{ } 

उपर्युक्त का भी उपयोग करेंगे, तो यह समझना आसान हो सकता है।

आप अपनी समस्या चाबी या शब्दकोश वस्तु के मूल्यों पर पुनरावृत्ति, उदाहरण के लिए द्वारा,

foreach (string key in dict.Keys) 
{ 
    foreach (string innerKey in dict[key].Keys) 
    { 
     System.Diagnostics.Debug.WriteLine(dict[key][innerKey]); 
    } 
} 
संबंधित मुद्दे