C#字典添加到错误的键/值对

时间:2011-03-18 01:02:40

标签: c# arrays string dictionary increment

我的程序中有以下foreach循环:

Dictionary<string, int[]> summaryDate_clipsEpisodesImps = new Dictionary<string, int[]>();
Dictionary<string, int[]> summaryPartner_clipsEpisodesImps = new Dictionary<string, int[]>();    

foreach (DataRow row1 in dt10.Rows)
{
     int[] numbers = new int[3];
     numbers[0] = 0;
     numbers[1] = 0;
     numbers[2] = 0;

     if (!dictionary1.ContainsKey(row1["value1"].ToString().Trim()))
     {
          dictionary1.Add(row1["value1"].ToString().Trim(), numbers);
     }

     if (!dictionary2.ContainsKey(row1["value2"].ToString().Trim()))
     {
          dictionary2.Add(row1["value2"].ToString().Trim(), numbers);
     }

     if (row1["yes_or_no"].ToString().Trim() == "yes")
     {
          dictionary1[row1["value1"].ToString().Trim()][0] = dictionary1[row1["value1"].ToString().Trim()][0] + Convert.ToInt32(row1["a_number"]);
          dictionary2[row1["value2"].ToString().Trim()][0] = dictionary2[row1["value2"].ToString().Trim()][0] + Convert.ToInt32(row1["a_number"]);
     }
}

基本上,我循环遍历数据表,并根据我在每条记录中找到的值创建字符串/ int数组的字典。然后我试图根据记录中另一个字段的存在增加数组中的第一个值。

当我检查yes_or_no值时,我的问题发生在if语句中。当在该语句中存在第二行递增字典2时,字典1中的值增加相同的值。我不知道为什么会这样。

如果不完全清楚,请告诉我。在此先感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

您正在为每个字典添加一个指向数组的指针。两个字典都查看相同的数组,因此当您通过dictionary2修改数组时,dictionary1会看到更改。

答案 1 :(得分:1)

这是因为两个字典条目中的值都指向numbers的同一个实例。这意味着对一个的任何改变都会影响另一个。

要在每个字典中添加一个新实例,您可以执行以下操作:

...
if (!dictionary1.ContainsKey(row1["value1"].ToString().Trim()))
{
    dictionary1.Add(row1["value1"].ToString().Trim(), GetNumbersArray());
}
if (!dictionary2.ContainsKey(row1["value2"].ToString().Trim()))
{
     dictionary2.Add(row1["value2"].ToString().Trim(), GetNumbersArray());
}
...

private int[] GetNumbersArray()
{
    int[] numbers = new int[3];

    numbers[0] = 0;
    numbers[1] = 0;
    numbers[2] = 0;

    return numbers;
}