2013-06-05 34 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

這正是OP已經擁有的代碼。 – 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)) 
    { 
    } 
} 

你的問題是,當你列舉了一本字典,你會得到一系列鍵/值對。在你的情況下,價值是內在的字典,它是,你需要

我正在使用Linq「Select()」操作將每個鍵/值對轉換爲值部分,即字典是鍵/值對中的值。

但是,這是一個冗長而低效的方式來獲取每個內部字典及其關鍵。下面是它應該怎麼做:

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

    // Do something with key and innerDict. 
} 

我假設你正在試圖訪問每個內部字典又同時knowning內心的字典的鍵外字典。

請注意,我只將item.Keyitem.Value的值複製到局部變量中以說明它們的類型。當然,您可以直接使用item.Keyitem.Value

如果你真的只需要內部字典本身(而你並不需要針對每個內部字典中的鍵),你可以做它像這樣(爲Nuffin建議):

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

你意識到字典有一個'Values'屬性,它可以直接訪問存儲的值,對嗎? – Nuffin

+0

@Nuffin我想他想和內部字典一起使用外部字典密鑰,所以我提出了第二種方法。首先,我剛糾正了語法錯誤。 –

0

你會即使在使用KVP時,仍然可以像您所希望的那樣參考字典。試試這個:

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>類型的元素。

如果你想訪問內部字典,只要這樣做,並放棄foreach循環。

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) 
{ } 

上述也會導致同樣的錯誤可能更容易理解。

您可以通過遍歷Dictionary對象的鍵或值,例如解決您的問題,

foreach (string key in dict.Keys) 
{ 
    foreach (string innerKey in dict[key].Keys) 
    { 
     System.Diagnostics.Debug.WriteLine(dict[key][innerKey]); 
    } 
}