【问题标题】:Iterating through nested dictionary is not working in C#遍历嵌套字典在 C# 中不起作用
【发布时间】:2016-05-23 09:34:03
【问题描述】:

我正在尝试从嵌套字典中打印结果

var variations_hash = new Dictionary<string, Dictionary<string, List<string>>>();

但它会引发一些随机错误

using System;
using System.Net;
using System.IO;
using System.Text.RegularExpressions;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Threading;

class Program
{
    static void Main()
    {
        var variations_hash = new Dictionary<string, Dictionary<string, List<string>>>();
        var variations = new Dictionary<string, List<string>>();

        variations["available"] = new List<string> { "hi" };
        var stores = new[] { "s", "m", "xl", "xxl", "xxxl", "v" };
        string color_trans = "blue";
        foreach (var sto in stores)
        {
            variations_hash[sto] = variations;
        }

        foreach(var job in variations_hash.Key())
        {
            foreach (var innerDict in variations_hash[key].Select(k => k.Value))
            {
                Console.Write(innerDict);
            }
        }
        Console.ReadLine();
    }
}

错误:

错误 CS1061 'Dictionary>>' 不包含 'Key' 的定义,并且找不到接受“Dictionary>>”类型的第一个参数的扩展方法 'Key'(您是否缺少 using 指令或程序集参考?)
ConsoleApplication1 c:\users\administrator\documents\visual studio 2015\Projects\ConsoleApplication1\ConsoleApplication1\Program.cs 29

错误 CS0103 当前上下文中不存在名称'key' ConsoleApplication1 c:\users\administrator\documents\visual studio 2015\Projects\ConsoleApplication1\ConsoleApplication1\Program.cs 31

警告 CS0219 变量“color_trans”已分配,但其值从未使用过
ConsoleApplication1 c:\users\administrator\documents\visual studio 2015\Projects\ConsoleApplication1\ConsoleApplication1\Program.cs 20

如何循环打印嵌套字典的所有内容?

【问题讨论】:

  • 使用.Keys 而不是variations_hash.Key()
  • 你想怎么打印?预期的输出是什么,它还应该包含键吗?
  • 这些根本不是“随机错误”。这些错误消息非常具体,对我来说似乎很清楚。您对它们有什么不了解,您期​​望Key() 方法做什么?您希望在 variations_hash[key] 中引用哪个变量?
  • 大声笑@JonSkeet。你有理解随机事物的超能力,也许我们应该成为朋友;)

标签: c# dictionary


【解决方案1】:

虽然您可以通过将Key() 替换为Keys 属性来解决此问题,但这不是迭代字典的最佳方式,因为您必须为循环中的每个键检索对象。

迭代键值对效率更高,如下所示:

foreach(var vHash in variations_hash) {
    Console.WriteLine("variations_hash key = {0}", vHash.Key);
    foreach (var inner in vHash.Value) {
        // Print inner dictionary key followed by comma-separated list
        Console.WriteLine(
            "--- {0}: {1}"
        ,   inner.Key
        ,   string.Join(", ", inner.Value)
        );
    }
}

注意每个循环如何让您不仅可以访问被迭代的字典的键(即vHash.Keyinner.Key),还可以访问与该键关联的值。

【讨论】:

    【解决方案2】:

    应该是variations_hash.Keys

    嵌套字典值也是List,所以使用SelectMany 来展平结构。

    foreach(var job in variations_hash.Keys)
    {
        foreach (var innerDict in variations_hash[key].SelectMany(k => k.Value))
        {
            Console.Write(innerDict);
        }
    }
    

    上面的代码可能会解决您的编译问题并打印所有嵌套字典值,但是要以正确的格式打印嵌套字典,您可以使用下面的代码。

    foreach(var kv in variations_hash)
    {
        foreach (var nestedKv in kv.Values)
        {
            Console.Write("Key {0}- Values{1}", nestedKv.Key, string.Join(",", nestedKv.Value));
        }
    }
    

    同样的事情使用Linq

    var lines = variations_hash.SelectMany(x=>x.Values)
                               .ToList().
                               .ForEach(kv => Console.WriteLine("Key {0}- Values{1}", kv.Key, string.Join(",", kv.Value)));
    

    【讨论】:

    • 循环变量不应该是key而不是job吗?
    • 理想情况下是的,因为 OP 使用了作业变量,我认为它有一些意义 :-) @YacoubMassad
    猜你喜欢
    • 1970-01-01
    • 2017-07-25
    • 2013-07-21
    • 1970-01-01
    相关资源
    最近更新 更多