迭代三重嵌套字典

本文关键字:三重 嵌套 字典 迭代 | 更新日期: 2023-09-27 18:06:10

我明白,这听起来有点奇怪,但我在我的程序中使用三重嵌套字典。这是我的数据表示最合适的形式。

代码示例:

Dictionary<string, IDictionary> outerDictionary;
Dictionary<string, IDictionary> middleDictionary;
Dictionary<string, string> innerDictionary;

从名字可以看出:innerDictionary是middleDictionary的"Value",middleDictionary是outerDictionary的"Value";

我试图迭代它,我需要从内部字典获取值。我想我被这个简单的任务困住了。

非常感谢任何帮助。提前谢谢。


PS>非常感谢你的帮助!

迭代三重嵌套字典

如果您只想要一个包含所有值的扁平列表,您可以使用链接SelectMany:

outerDictionary.SelectMany(d => d.Value)  // middle Dictinoary
               .SelectMany(d => d.Value)
               .Select(kvp => kvp.Value); // inner Dictionary

蛮力:

foreach(KeyValuePair<string, IDictionary> entryOuter in outerDictionary)
{
    foreach(KeyValuePair<string, IDictionary> entryMiddle in entryOuter.Value)
    {
        foreach(KeyValuePair<string, string> entry in entryMiddle.Value)
        {
            // do something with entry.Value
        }
    }
}

如果您的outerDictionary是这样声明的

Dictionary<string,Dictionary<string,Dictionary<string,string>>> outerDictionary;

可以像这样迭代最里面的值:

var innermost = outerDictionary.Values
   .SelectMany(v1 => v1.Values.SelectMany(v2 => v2.Values));

如果由于某种原因你正在使用非泛型字典,但你是在。net 3.5或更高版本,你可以通过添加对Cast<>的调用来修复这个问题,像这样:

var innermost = outerDictionary.Values.Cast<Dictionary<string,Dictionary<string,string>>>
    .SelectMany(v1 => v1.Values.SelectMany(v2 => v2.Values));

如文档中所述,Values属性是包含的所有值的枚举;所以你可以使用

foreach ( var middleDictionary in outerDictionary.Values )
{
  foreach ( var innerDictionary in outerDictionary.Values )
  {
    foreach ( string iString in innerDictionary.Values )
    {
      // your code
    }
  }
}

您可能应该使用一种不同的数据结构,这种结构比三层字典更容易考虑。即使你不这样做,你也应该使用类型的字典:

Dictionary<string, Dictionary<string, Dictionary<string, string>>> TripleDictionary;

然后可以像这样遍历它们:

foreach (KeyValuePair<string, IDictionary> first in TripleDictionary)
{
    foreach (KeyValuePair<string, IDictionary> second in first.Value)
    {
        foreach (KeyValuePair<string, string> third in second.Value)
        {
            string x = third.Value;
            // Do stuff
        }
    } 
}

隐式类型将使其更具可读性:

foreach (var first in TripleDictionary)
{
    foreach (var second in first.Value)
    {
        foreach (var third in second.Value)
        {
            string x = third.Value;
            // Do stuff
        }
    } 
}