Использование TryGetValue из ключа и добавление не работает, как задумано

У меня есть этот код для извлечения значения (целочисленный массив) из словаря, а затем увеличить один из элементов внутри целочисленного массива на основе оператора if, в котором он находится..

        Dictionary<string, int[]> ResultDic = new Dictionary<string, int[]>();
        if (TeamOnePoint > TeamTwoPoint)
        {
            ResultDic.TryGetValue(TeamOneResult, out OutOfDic);
            OutOfDic[0]++;
            OutOfDic[1]++;
            ////ResultDic.Remove(TeamOneResult);
            ////ResultDic.Add(TeamOneResult, OutOfDic);
            ResultDic[TeamOneResult] = OutOfDic;;
            ResultDic.TryGetValue(TeamTwoResult, out OutOfDic);
            OutOfDic[0]++;
            OutOfDic[2]++;
            ////ResultDic.Remove(TeamTwoResult);
            ////ResultDic.Add(TeamTwoResult, OutOfDic);
            ResultDic[TeamTwoResult] = OutOfDic;
            }

Теперь проблема, с которой я столкнулся, заключается в том, что я всегда читаю измененный массив OutOfDic обратно в словарь в часть значения, в которой я указал ключ, также изменяется каждое значение в словаре, а не только ключ, который я указал. Часть с комментариями дает тот же результат, что и часть без комментариев. Как исправить эту проблему, чтобы добавить значение только к указанному ключу?

1 ответ

Поведение, которое вы описали, возможно, только если вы добавили один и тот же массив в словарь несколько раз. Поскольку массивы являются ссылочными типами, каждое изменение повлияет на все значения в словаре.

Так что вместо этого (например):

Dictionary<string, int[]> ResultDic = new Dictionary<string, int[]>();
int[] array = { 1, 2, 3, 4, 5 };
ResultDic.Add("TeamOne", array);
ResultDic.Add("TeamTwo", array);

Вы должны сделать это:

int[] array = { 1, 2, 3, 4, 5 };
ResultDic.Add("TeamOne", array);
array = new int[] { 1, 2, 3, 4, 5 };
ResultDic.Add("TeamTwo", array);

Обратите внимание, что нет необходимости переназначать массив в словарь по той же причине (это ссылочный тип). Таким образом, вы можете удалить эти строки:

ResultDic[TeamOneResult] = OutOfDic;;
// ....
ResultDic[TeamTwoResult] = OutOfDic;
Другие вопросы по тегам