Словари могут быть вложены следующим образом:
var dictionary = new Dictionary<string, Dictionary<string, int>>();
Инициализировать вложенный словарь:
var dictionary = new Dictionary<string, Dictionary<string, int>>
{
{ "a1", new Dictionary<string, int> { { "b1a", 1 }, { "b1b", 2 } } },
{ "a2", new Dictionary<string, int> { { "b2a", 3 }, { "b2b", 4 } } }
};
Затем вы будете индексировать в словарь так:
int x = dictionary["a1"]["b1a"];
Assert.AreEqual(1, x);
РЕДАКТИРОВАТЬ: чтобы иметь произвольную глубину, вам нужно создать свой собственный тип со встроенным вложением, например,
class Node
{
public int Value { get; set; }
public Dictionary<string, Node> Children { get; set; }
// The indexer indexes into the child dictionary.
public Node this[string key] => Children[key];
}
Обычно я определяю детей как список, но вам нужны словари.
Пример использования:
var node = new Node
{
Children = new Dictionary<string, Node>
{
{ "a1", new Node
{
Children = new Dictionary<string, Node>
{
{ "b1a", new Node { Value = 1 } },
{ "b1b", new Node { Value = 2 } }
}
}
},
{ "a2", new Node
{
Children = new Dictionary<string, Node>
{
{ "b2a", new Node { Value = 3 } },
{ "b2b", new Node { Value = 4 } }
}
}
}
}
};
int y = node["a1"]["b1a"].Value;
Assert.AreEqual(1, y);
Это может go настолько глубоко, насколько вам нужно - просто вставьте другой словарь в свойство Children конечного узла.