Использование 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;