如何访问嵌套字典<> foreach循环中的对象

时间:2013-06-05 13:29:49

标签: c# dictionary foreach nested

我有一个嵌套的Dictionary结构,如下所示:

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&lt; string,string&gt;在内部循环中,但我想作为一个整体访问字典对象本身(这样我可以做这样的事情:if(dict.ContainsKey(innerDict)){...})

7 个答案:

答案 0 :(得分:5)

修复它的最小代码更改是这样的(但请参阅此答案中下一个代码段中的正确方法):

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

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

您的问题是,当您对字典进行枚举时,会得到一系列键/值对。在您的情况下,Value是内部字典,它是您需要的

我正在使用Linq“Select()”操作将每个键/值对转换为值部分,即字典,它是键/值对中的值。

然而,这是一个冗长而低效的方式来获取每个内部字典及其键。这是应该如何做的:

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

    // Do something with key and innerDict.
}

我假设您正在尝试依次访问每个内部字典,同时在外部字典中知道内部字典的密钥。

请注意,我只将item.Keyitem.Value中的值复制到局部变量中以说明其类型。当然,您可以直接使用item.Keyitem.Value

如果你真的只想要内部字典本身(并且你不需要每个内部字典的密钥),你可以这样做(正如Nuffin建议的那样):

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

答案 1 :(得分:1)

那是因为string键的值不是列表。如果这是您想要的,请将Dictionary的声明更改为Dictionary<string, List<Dictionary<string, string>>> dict;

或者您可以在第一个foreach循环中抓取字典,如下所示:

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

并从那里使用它。但无论哪种方式,你都试图反复一些不可枚举的东西。

我认为您可能已经定义了Dictionary,只是不需要内循环。

答案 2 :(得分:1)

你可以通过使用:

来保持简短
foreach (Dictionary<string, string> d in dict.Values) {
}

它有效,没有来自编译器的抱怨。

另请注意,您的代码不起作用,因为在该上下文中,dict[key] 不是字典集合,而是单个字典。

答案 3 :(得分: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]);
    }
}

答案 4 :(得分:0)

即使您使用KVP,您仍然可以按照自己的意愿使用字典。试试这个:

foreach (var outerKVP in dict {
    foreach (var innerKVP in dict[outerKVP.Key]) {
        var theString = dict[outerKVP.Key][innerKVP.Key];
    }
}

答案 5 :(得分: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];

答案 6 :(得分: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);
    }
}