迭代三重嵌套字典
本文关键字:三重 嵌套 字典 迭代 | 更新日期: 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
}
}
}