【问题标题】:C# dictionary adding to wrong key/value pairC# 字典添加到错误的键/值对
【发布时间】:2011-07-17 20:20:31
【问题描述】:

我的程序中有以下 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"]);
     }
}

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

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

如果这不完全清楚,请告诉我。提前感谢您的帮助。

【问题讨论】:

  • 我不明白。 if 语句中的代码清楚地将两个字典中的元素增加了相同的数量(row["a_number"])。你期待它做什么?
  • 另外,您应该在foreach 块的顶部附近评估一次row1["value1"].ToString().Trim(),并将其缓存在一个局部变量中(对于 value2 也是如此)。

标签: c# arrays string dictionary increment


【解决方案1】:

您正在向每个字典添加指向数组的指针。两个字典看的是同一个数组,所以当你通过dictionary2修改数组时,dictionary1会看到变化。

【讨论】:

    【解决方案2】:

    这是因为两个字典条目中的值都指向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;
    }
    

    【讨论】:

    • 这正是问题所在。解决方案完美运行。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-29
    • 1970-01-01
    • 2018-05-27
    • 2019-02-14
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多