通过三重嵌套字典迭代

时间:2014-06-02 13:49:24

标签: c#

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

代码示例:

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

正如你可以从名字中怀疑的那样:innerDictionary是&#34; Value&#34; of middleDictionary和middleDictionary是&#34; Value&#34; of outerDictionary;

我正在尝试迭代它,我需要从内部词典中获取值。我想我被这个简单的任务困扰了。

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


PS&gt;非常感谢您的帮助!

5 个答案:

答案 0 :(得分:4)

如果您只想要一个所有值的平面列表,则可以使用链式SelectMany执行此操作:

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

答案 1 :(得分:3)

蛮力:

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
        }
    }
}

答案 2 :(得分:2)

如果您的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));

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

您可能应该使用比tripledecker词典更容易思考的不同数据结构。即使你没有,你也一定要使用键入的词典:

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
        }
    } 
}