从密钥使用TryGetValue并添加不作为intened工作

时间:2016-06-06 12:53:48

标签: c# dictionary key 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数组读回到字典中的值部分,我指定了Key,字典中的每个值也被修改,而不仅仅是我指定的键。 注释部分给出与未注释部分相同的结果。如何解决此问题仅将值添加到指定的键?

1 个答案:

答案 0 :(得分:2)

只有在多次向字典中添加相同的数组时,才能实现您所描述的行为。由于数组为reference types,因此每次更改都会影响字典中的所有值。

所以不要这样做(例如):

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;