Странное поведение вложенного словаря в Unity C # - PullRequest
2 голосов
/ 07 мая 2019

Я использую словарь в словаре.Последнее назначенное значение ключа также сохраняется в качестве значений для всех предыдущих ключей, даже если индивидуальные назначения клавиш различаются.Я что-то упускаю?

Dictionary<string, Dictionary <int,bool>> seenValsRounds= new Dictionary<string, Dictionary<int, bool>>();

void prepareRoundsVals()
    {       
        Dictionary <int,bool> roundVals = new Dictionary<int, bool> ();
        roundVals.Add (0,false);
        seenValsRounds.Add ("A", roundVals);
        seenValsRounds.Add ("B", roundVals);
        seenValsRounds.Add ("C", roundVals);
        seenValsRounds.Add ("D", roundVals);
        seenValsRounds ["A"] [0] = false;
        seenValsRounds ["B"] [0] = false;
        seenValsRounds ["C"] [0] = false;
        seenValsRounds ["D"] [0] = true;
        foreach (KeyValuePair<string, Dictionary<int,bool>> kvp in seenValsRounds) {            
            Debug.Log(kvp.Key + " in round " + 0 + ": " + seenValsRounds [kvp.Key][0]);     
        }
    }

Ожидаемые результаты: A - ложь, B - ложь, C - ложь, D - истина

Фактические результаты: A - истина, B - истина, CВерно, D Истинно


Решено ниже согласно предложениям из ответов и комментариев.Каждый вложенный словарь также должен быть «новым»:

        Dictionary <int,bool> roundVals1 = new Dictionary<int, bool> ();
        Dictionary <int,bool> roundVals2 = new Dictionary<int, bool> ();
        Dictionary <int,bool> roundVals3 = new Dictionary<int, bool> ();
        Dictionary <int,bool> roundVals4 = new Dictionary<int, bool> ();
        roundVals1.Add (0,false);
        roundVals2.Add (0,false);
        roundVals3.Add (0,false);
        roundVals4.Add (0,false);
        seenValsRounds.Add ("A", roundVals1);
        seenValsRounds.Add ("B", roundVals2);
        seenValsRounds.Add ("C", roundVals3);
        seenValsRounds.Add ("D", roundVals4);

1 Ответ

1 голос
/ 07 мая 2019

Это потому, что вы помещаете одну и ту же ссылку на объект словаря roundVals в словаре seenValsRounds.Вы должны создать новый словарь для A, B, C и D.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...