0

ディクショナリから値(整数配列)を取得するこのコードがあります次に、それが含まれているifステートメントに基づいて、整数配列内の要素の1つをインクリメントします..

        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 配列をディクショナリに読み込んで、キーを指定した値の部分に戻すたびに、指定したキーだけでなく、ディクショナリ内のすべての値も変更されることです。コメントされた部分は、コメントされていない部分と同じ結果になります。この問題を修正して、指定したキーにのみ値を追加するにはどうすればよいですか?

4

1 に答える 1

2

説明した動作は、同じ配列を辞書に複数回追加した場合にのみ可能です。配列は参照型であるため、すべての変更はディクショナリ内のすべての値に影響します。

したがって、これを行う代わりに(たとえば):

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;
于 2016-06-06T13:03:10.043 に答える