从键中使用 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 数组读回字典中指定键的值部分时,字典中的每个值也会被修改,而不仅仅是我指定的键。注释部分给出的结果与未注释部分的结果相同。如何解决此问题以仅将值添加到指定的键?

只有当您多次将相同的数组添加到字典中时,您描述的行为才有可能。由于数组是引用类型,因此每次更改都会影响字典中的所有值。

因此,与其这样做(例如):

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;

最新更新