Добавление словаря C # в неправильную пару ключ / значение - PullRequest
0 голосов
/ 18 марта 2011

В моей программе есть следующий цикл 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 на основе значений, которые я нахожу в каждой записи. Затем я пытаюсь увеличить первое значение в массиве на основе наличия другого поля в записи.

Моя проблема возникает в операторе if, когда я проверяю значение yes_or_no. Когда в этом выражении присутствует словарь2 с увеличением второй строки, значение в словаре 1 увеличивается на то же значение. Я понятия не имею, почему это так.

Пожалуйста, дайте мне знать, если это не совсем понятно. Заранее спасибо за помощь.

Ответы [ 2 ]

1 голос
/ 18 марта 2011

Это потому, что значения в обеих словарных статьях указывают на один и тот же экземпляр 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;
}
1 голос
/ 18 марта 2011

Вы добавляете указатель на массив для каждого словаря.Оба словаря смотрят на один и тот же массив, поэтому, когда вы изменяете массив через dictionary2, dictionary1 видит изменения.

...