2014-06-02 5 views
1

Я понимаю, что это звучит немного странно, но я использую тройной вложенный словарь в своей программе. Это наиболее подходящая форма для моего представления данных.Iterate через тройной вложенный словарь

Пример кода:

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

Как можно заподозрить из имен: innerDictionary является "Value" из middleDictionary и middleDictionary является "Value" в outerDictionary;

И я пытаюсь пройти через него, мне нужно получить значения из внутреннего Словаря. Я думаю, что я застрял в этой простой задаче.

Очень понравилась бы любая помощь. Спасибо заранее.


PS> Спасибо большое за вашу помощь!

+2

Вам понадобятся вложенные петли. – PaulG

+2

Если вы не можете использовать выбранную структуру данных, возможно, это не подходит? – Zache

+2

Если у вас есть словарь >> outerDictionary', то вы можете получить все значения как 'string [] values ​​= outerDictionary.SelectMany (p => p.Value.SelectMany (pp => pp.Value.Values)). ToArray(); '. –

ответ

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)); 
+0

Спасибо! работал как шарм! – Mad

4

Если вы просто хотите плоский список всех значений, вы можете сделать это с цепью SelectMany:

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

Я думаю, что вы имеете в виду «Значения» – Xiaoy312

+0

@ Xiaoy312 Я не уверен, элемент в 'SelectMany' будет' KeyValuePair ', поэтому свойство' Value'. Он вернет 'IEnumerable >'. –

+0

@D Стэнли А, ему не хватает окончательного '.Select (kvp => kvp.Value)', чтобы получить 'IEnumerable ' return. И он предполагает, что тип, который вы повторяете, это что-то вроде: 'Словарь <строка, словарь <строка, словарь <строка, строка >>>'. –

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

Вы имеете в виду «Ценности» вместо «Ценность»? – Codor

+0

Значение - это знак для ввода entryOuter и entryMiddle, поэтому я не сделал этого :) – AlexanderBrevig

+0

Спасибо за разъяснение, я ошибся. – Codor

1

Как описано в documentation, свойство Values является перечислением всех содержащихся значений; так что вы могли бы использовать

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

Вы, вероятно, следует использовать другую структуру данных, что легче думать о чем tripledecker словарях. Даже если вы этого не сделаете, вы должны обязательно использовать напечатал словарей:

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

Вы можете itereate throgh их так:

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 
     } 
    } 
} 
Смежные вопросы