通过嵌套字典迭代在C#中不起作用

时间:2016-05-23 09:34:04

标签: c# dictionary

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

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'字典&gt;&gt;'不包含'Key'的定义,也没有扩展方法'Key'接受类型'Dictionary&gt;&gt;'的第一个参数可以找到(你错过了使用指令或汇编参考吗?)
  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

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

2 个答案:

答案 0 :(得分:2)

尽管您可以通过将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),还可以访问与该键相关联的值。

答案 1 :(得分:0)

应为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)));