Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
32 / 12 / 5
Регистрация: 02.04.2022
Сообщений: 331

Рекурсивно-перечисляемый словарь

16.03.2025, 21:46. Показов 1469. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Мне нужен Dictionary<TKey, TValue> который может содержать в себе старший словарь и который можно перечислить в foreach рекурсивно вместе со всеми словарями в цепочке Child -> Parent

Пример того что мне нужно :
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
RecursiveDictionary<string, int> first = new RecursiveDictionary<string, int>(null)
{
    { "str1", 1 },
    { "str2", 2 },
    { "str3", 3 }
};
 
RecursiveDictionary<string, int> second = new RecursiveDictionary<string, int>(first)
{
    { "str1.1", 4 },
    { "str1.2", 5 },
    { "str1.3", 6 }
};
 
RecursiveDictionary<string, int> third = new RecursiveDictionary<string, int>(second)
{
    { "str2.1", 7 },
    { "str2.2", 8 },
    { "str2.3", 9 }
};
 
foreach (KeyValuePair<string, int> pair in third)
{
    Console.WriteLine("{0} - {1}", pair.Key, pair.Value);
    // output :
    // str2.1 - 7
    // str2.2 - 8
    // str2.3 - 9
    // str1.1 - 4
    // str1.2 - 5
    // str1.3 - 6
    // str1 - 1
    // str2 - 2
    // str3 - 3
}
 
foreach (KeyValuePair<string, int> pair in first)
{
    Console.WriteLine("{0} - {1}", pair.Key, pair.Value);
    // output :
    // str2.1 - 7
    // str2.2 - 8
    // str2.3 - 9
}
 
Console.WriteLine(third["str1.2"]); // output : 5
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.03.2025, 21:46
Ответы с готовыми решениями:

Выбор пути исполнения с помощью перечисляемого типа
Добрый вечер! Есть работающий код программы. &quot;Найти количество отрицательных чисел среди a, b, c и абсолютное значение суммы этих...

Замена в словаре значения у ключа
Вот такой словарь static Dictionary&lt;string, string&gt; AllData = new Dictionary&lt;string, object&gt;(); AllData .Add(&quot;первый&quot;, null); ...

В имеющемся словаре найти пары слов (анаграммы)
В имеющемся словаре найти пары слов (анаграммы), при прочтении каждого из которых в обратном направлении образуется другое слово пары,...

3
 Аватар для IamRain
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,226
16.03.2025, 23:25
Лучший ответ Сообщение было отмечено Timchik230 как решение

Решение

Просто создайте 2-ой словарь на основе первого, а третий на основе второго.
Dictionary (aka Symbol Table, aka Associative Array, aka Map, aka Hashmap) - это ADT, который строит ассоциации между ключами и значениями (это его инвариант), больше никакой другой функционал в него не заложен.
И не должен быть заложен.

Добавлено через 2 минуты
Если очень хочется, то реалузуйте уже сами. Детали все равно остаются за вами - где искать в первую очередь - в текущем словаре или в родителе, как удалять и прочее...
1
32 / 12 / 5
Регистрация: 02.04.2022
Сообщений: 331
17.03.2025, 00:12  [ТС]
Цитата Сообщение от IamRain Посмотреть сообщение
Просто создайте 2-ой словарь на основе первого, а третий на основе второго.
Если я сделаю изменения во втором словаре, это не отразиться на третьем, а мне нужно чтобы отражалось.

Цитата Сообщение от IamRain Посмотреть сообщение
Если очень хочется, то реалузуйте уже сами.
Что мне и пришлось делать. Просто обернул два словаря (Inner & Parent) в класс реализующий IEnumerable который делает IEnumerator свап прямо во время перечисления
0
Эксперт .NET
 Аватар для Wolfdp
3788 / 1765 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
17.03.2025, 01:43
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
var first = new RecursiveDictionary<string, int>(null)
{
    { "str1", 1 },
    { "str2", 2 },
    { "str3", 3 }
};
var second = new RecursiveDictionary<string, int>(first)
{
    { "str1.1", 4 },
    { "str1.2", 5 },
    { "str1.3", 6 }
};
var third = new RecursiveDictionary<string, int>(second)
{
    { "str2.1", 7 },
    { "str2.2", 8 },
    { "str2.3", 9 }
};
 
foreach ((string key, int value) in third as IEnumerable<(string, int)>)
    Console.WriteLine("{0} - {1}", key, value);
 
 
public class RecursiveDictionary<TKey, TValue>(Dictionary<TKey, TValue>? parent)
    : Dictionary<TKey, TValue>, IEnumerable<(TKey, TValue)>
    where TKey : notnull
{
    private readonly Dictionary<TKey, TValue>? _parent = parent;
 
    IEnumerator<(TKey, TValue)> IEnumerable<(TKey, TValue)>.GetEnumerator()
        => GetAll(this).GetEnumerator();
 
    private IEnumerable<(TKey, TValue)> GetAll(RecursiveDictionary<TKey, TValue> dic)
    {
        foreach ((var key, var value) in dic)
            yield return (key, value);
        if (dic._parent is RecursiveDictionary<TKey, TValue> sub)
        {
            foreach (var item in GetAll(sub))
                yield return item;
        }
        else
        { 
            foreach ((var key, var value) in dic._parent ?? [])
                yield return (key, value);
        }
    }
}
Добавлено через 14 минут
Можно ещё упоротей сделать через перегрузку new

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
var first = new RecursiveDictionary<string, int>(null)
{
    { "str1", 1 },
    { "str2", 2 },
    { "str3", 3 }
};
var second = new RecursiveDictionary<string, int>(first)
{
    { "str1.1", 4 },
    { "str1.2", 5 },
    { "str1.3", 6 }
};
var third = new RecursiveDictionary<string, int>(second)
{
    { "str2.1", 7 },
    { "str2.2", 8 },
    { "str2.3", 9 }
};
 
Console.WriteLine("third");
foreach ((string key, int value) in third)
    Console.WriteLine("{0} - {1}", key, value);
 
Console.WriteLine("first");
foreach ((string key, int value) in first)
    Console.WriteLine("{0} - {1}", key, value);
 
 
public class RecursiveDictionary<TKey, TValue>(Dictionary<TKey, TValue>? parent)
    : Dictionary<TKey, TValue>
    where TKey : notnull
{
    private readonly Dictionary<TKey, TValue>? _parent = parent;
 
    public new IEnumerator<KeyValuePair<TKey, TValue>>GetEnumerator()
        => GetAll(this).GetEnumerator();
 
    private IEnumerable<KeyValuePair<TKey, TValue>> GetAll(RecursiveDictionary<TKey, TValue> dic)
    {
        foreach ((var key, var value) in (Dictionary<TKey, TValue>)dic)
            yield return new (key, value);
        if (dic._parent is RecursiveDictionary<TKey, TValue> sub)
        {
            foreach (var item in GetAll(sub))
                yield return item;
        }
        else
        { 
            foreach ((var key, var value) in dic._parent ?? [])
                yield return new (key, value);
        }
    }
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.03.2025, 01:43
Помогаю со студенческими работами здесь

"Ключ отсутствует в словаре" при заполнении Dictionary из файла
здравствуйте. у меня такая проблема. создаю словарь из файла и подсчитываю кол-во каждого слова в файле. выдает ошибку на строку 32....

Сортировка по убыванию в словаре
Мне надо сделать сортировку чтобы выводилось в порядке убывания количества повторений. IDictionary&lt;string, int&gt; wordsCounts =...

Выбрасывает исключение, что в словаре уже есть такой ключ
Пытаюсь сделать чтение из xml и добавление в словарь, код такой: if(!File.Exists(@&quot;articles.xml&quot;)) { ...

Данный ключ отсутствует в словаре!
что это за ошибка такая? часть проги вы увидите на картинке! подскажите, в чем же может быть ошибка! или что это означает??!

Ошибка при загрузке данных из бд в dataGrid1 "Данный ключ отсутствует в словаре"
Всем доброго времени суток. Заранее извиняюсь если данная тема уже подымалась. У меня при компиляции кода DataTable usertable =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru