C# 遍历嵌套字典在C中不起作用#

C# 遍历嵌套字典在C中不起作用#,c#,dictionary,C#,Dictionary,我正在尝试打印嵌套字典的结果 var variations_hash = new Dictionary<string, Dictionary<string, List<string>>>(); var variations_hash=new Dictionary(); 但它会抛出一些随机错误 using System; using System.Net; using System.IO; using System.Text.RegularExpressio

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

var variations_hash = new Dictionary<string, Dictionary<string, List<string>>>();
var variations_hash=new Dictionary();
但它会抛出一些随机错误

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();
    }
}
使用系统;
Net系统;
使用System.IO;
使用System.Text.RegularExpressions;
使用系统集合;
使用System.Collections.Generic;
使用System.Linq;
使用系统线程;
班级计划
{
静态void Main()
{
var variations_hash=新字典();
var variations=newdictionary();
变体[“可用”]=新列表{“hi”};
var存储=新[]{“s”、“m”、“xl”、“xxl”、“xxxl”、“v”};
字符串颜色\u trans=“蓝色”;
foreach(存储中的var sto)
{
变体\u hash[sto]=变体;
}
foreach(variances\u hash.Key()中的var作业)
{
foreach(变量中的var innerDict_hash[key]。选择(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当前上下文ConsoleApplication1 c:\users\administrator\documents\visual studio 2015\Projects\ConsoleApplication1\ConsoleApplication1\Program.cs中不存在名称“key”

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


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

应该是
变体\u hash.Keys

嵌套的字典值也是一个
列表
,因此使用
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)));

它应该是
variations\u hash.Keys

嵌套的字典值也是一个
列表
,因此使用
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()
替换为
Keys
property来纠正此问题,但这并不是迭代字典的最佳方式,因为必须为循环中的每个键检索对象

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

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.key
internal.key
),还可以访问与该键相关的值。

尽管您可以通过将
key()
替换为
key
属性来纠正此问题,这不是迭代字典的最佳方式,因为必须为循环中的每个键检索对象

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

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.key
internal.key
),还可以访问与该键关联的值。

循环变量不应该是
key
而不是
job
?理想情况下是,由于OP使用了job变量,我认为它有一些含义:-)@yacoubmassads循环变量不应该是
key
而不是
job
?理想情况下是的,因为OP使用了job变量,我认为它有一些含义:-)@YacoubMassadUse
。Keys
而不是
variations\u hash.key()
您到底想如何打印它?预期的输出是什么?它是否也应该包含键?这些根本不是“随机错误”。这些错误信息非常具体,对我来说似乎非常清楚。关于它们,您不了解什么,您希望
Key()
方法做什么?您希望在
变体\u hash[key]
中引用哪个变量?Lol@JonSkeet。你有理解随机事物的超能力,也许我们应该成为朋友;)使用
.Keys
而不是
变体\u hash.Key()
如何打印它?预期的输出是什么?它是否也应该包含键?这些根本不是“随机错误”。这些错误信息非常具体,对我来说似乎非常清楚。关于它们,您不了解什么,您希望
Key()
方法做什么?您希望在
变体\u hash[key]
中引用哪个变量?Lol@JonSkeet。你有理解随机事物的超能力,也许我们应该成为朋友;)