Изменение значения указанного c словарного ключа - PullRequest
0 голосов
/ 21 июня 2020

Итак, проблема в следующем: у меня есть словарь, который выглядит так

Dictionary<string, Dictionary<string, int>> Stats

Для визуализации:

"Stats":{
            "1":{
               "True":0,
               "False":0
            },
            "2":{
               "True":0,
               "False":0
            }
        }

Итак, я хочу изменить значение «True «где ключ -« 1 ». Мой код выглядит так:

CurrentStats.Stats["1"]["True"] += 1;

Но он меняет значение «Истина» как для ключа «1», так и для ключа «2». Как я могу это исправить и почему меняются оба значения?

public async Task<IStatistics> CreateStats()
    {
        Dictionary<string, Dictionary<string, int>> stats = new Dictionary<string, Dictionary<string, int>>();
        Dictionary<string, int> dt = new Dictionary<string, int>();
        dt.Add("True", 0);
        dt.Add("False", 0);
        var topics = new TopicServices();
        foreach (var item in (await topics.GetTopics()).ToList())
        {
            stats.Add(item.id, dt);
        }
        var st = new Statistics() { Stats = stats };

        return st;
    }

это функция, которую я использую для инициализации словаря

1 Ответ

2 голосов
/ 21 июня 2020

Обратите внимание, что когда вы инициализируете вложенный словарь, вы инициализировали только один внутренний словарь и просто добавляли этот тот же во внешний словарь дважды:

    // only one "new Dictionary" is created below
    Dictionary<string, int> dt = new Dictionary<string, int>();
    dt.Add("True", 0);
    dt.Add("False", 0);
    var topics = new TopicServices();
    foreach (var item in (await topics.GetTopics()).ToList())
    {
        stats.Add(item.id, dt); // that same dictionary is added to the outer dictionary many times
    }

Итак, CurrentStats.Stats["1"] и CurrentStats.Stats["2"] на самом деле относится к одному и тому же объекту Dictionary.

Чтобы исправить это, вам нужно каждый раз создавать новый словарь, просто перемещайте код создания словаря внутри l oop:

    var topics = new TopicServices();
    foreach (var item in (await topics.GetTopics()).ToList())
    {
        Dictionary<string, int> dt = new Dictionary<string, int>();
        dt.Add("True", 0);
        dt.Add("False", 0);
        stats.Add(item.id, dt);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...