Словарь vb.net меняет значение, если используется переменная-заполнитель - PullRequest
1 голос
/ 17 марта 2012
    Public Module Module1
        Public objDictionary As New Dictionary(Of String, ArrayList)
    End Module

    Dim i As Integer
    Dim j As Integer
    Dim temp As New ArrayList
    For j = 0 To (objCreater.RowCount - 2)
        i = 1
        temp.Clear() 
        For i = 1 To 4 'Marker 1 for comments
            If i = 4 Then
                temp.Insert(i - 1, New ArrayList())
            Else
                temp.Insert(i - 1, Convert.ToInt32(objCreater.Rows(j).Cells(i).Value))
            End If
        Next
        objDictionary.Add(objCreater.Rows(j).Cells(0).Value, temp) 'Marker 2 for comments
    Next

Когда код Above выполняется на каждой итерации, каждый ключ, связанный с переменной temp, изменяется.

Так что, если, например, ваш ввод выглядит так: http://imgur.com/yWDo1

input form.  Input is "green",3,2,1">

в непосредственном режиме ? objDictionary ("red") на первом проходе цикла For j = 0 даст ожидаемое.

?objDictionary("red")
Count = 4
    (0): 1 {Integer}
    (1): 2 {Integer}
    (2): 3 {Integer}
    (3): Count = 0

Однако на втором проходе значение? ObjDictionary ("red") изменяется по мере изменения временного ArrayList.

? ObjDictionary ("red") у маркера 1

?objDictionary("red")
Count = 0

? ObjDictionary ("red") у маркера 2

?objDictionary("red")
Count = 4
    (0): 3 {Integer}
    (1): 2 {Integer}
    (2): 1 {Integer}
    (3): Count = 0

Другими словами, значения последней использованной строки хранятся в каждой комбинации словаря и значения. Как вы предотвращаете это? Это явно связано с использованием временной переменной, так как словарь изменяется при изменении временной переменной. Есть ли способ только скопировать значения из массива, а не связать словарь с изменяющимися значениями массива?

1 Ответ

1 голос
/ 17 марта 2012

Как вы и подозревали, вы указываете на один и тот же массив со всеми вашими вставками.

Это означает, что всякий раз, когда вы вносите изменение, затрагивается каждая запись.

Решение - указать temp на новый ArrayList с каждой итерацией - т.е. заменить вызов на temp.clear():

temp = new ArrayList
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...