我理解,这听起来有点奇怪,但我在程序中使用了三重嵌套字典。它是我的数据表示最合适的形式。
代码示例:
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;非常感谢您的帮助!
答案 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
}
}
}