C# словарь рекурсии - PullRequest
       45

C# словарь рекурсии

1 голос
/ 26 февраля 2020

Я ищу конструкцию в c#, где словари содержат словари для подсчета n. Я хочу поместить список словарей в него, и он создает какой-то индекс.

Я хочу назвать его как dic[key][key2][key3], где значением является объект, или словарь или словарь, содержащий больше словарей.

Я думаю, что elasti c может предоставить что-то подобное, но наше решение - это отдельное клиентское приложение.

1 Ответ

1 голос
/ 26 февраля 2020

Словари могут быть вложены следующим образом:

        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 конечного узла.

...