#vb.net #wcf #list #for-loop #each
#vb.net #wcf #Список #цикл for #каждый
Вопрос:
Я пытаюсь заполнить один список из другого. Я бы подумал, что этот код должен сработать, но в конце дня я получаю список идентичных элементов.
Public Sub WriteDatFile(ByRef lstReasons As System.Collections.Generic.List(Of LetterReason))
Dim tmplstReason As New TCPService.LetterReason
Dim tmplstReasons As New System.Collections.Generic.List(Of TCPService.LetterReason)
'Load the letter reasons
For Each LetterReason In lstReasons
tmplstReason._reason = LetterReason.Reason
tmplstReasons.Add(tmplstReason)
Next
RetVal = .......
End Sub
Теперь, когда я устанавливаю точку останова и проверяю из вызывающего WCF, я получаю это:
lstReason(0).Причина = Одна
lstReason(1).Причина = две
lstReason(2).Причина = Три
Но, когда я устанавливаю точку останова (после загрузки) в этой подпрограмме, я получаю следующий вывод:
tmplstReason(0)._reason = Три
tmplstReason(0)._reason = Три
tmplstReason(0)._reason = Три
Что происходит??? Есть идеи?
Спасибо, Джейсон
Ответ №1:
Вам нужно создать новый экземпляр LetterReason
внутри цикла и добавить новый экземпляр в список. Попробуйте это
For Each LetterReason In lstReasons
Dim tmplstReason As New TCPService.LetterReason
tmplstReason._reason = LetterReason.Reason
tmplstReasons.Add(tmplstReason)
Next
Ответ №2:
tmplstReason._reason = LetterReason.Reason
tmplstReasons.Add(tmplstReason)
Посмотрите внимательно. На самом деле вы не меняете tmplstReason, вы меняете его свойство ._reason . Затем вы добавляете tmplstReason в список 3 раза.
В результате вы фактически каждый раз добавляете в список одно и то же и каждый раз изменяете переменную ._reason этого одного объекта. Поскольку все они одинаковы, все они имеют одинаковое значение. 🙂