2016-03-24 6 views
0

Я хочу скопировать содержимое одного из списка (объекта) в другое и изменить одно значение. Есть ли способ удалить ссылку?Удалить ссылку из списка объектов в vb.net

В образце кода я получаю результат 'test2 test2', когда я ожидаю 'test1 test2'.

Module Module1 

Sub Main() 
    Dim ListOfSample As New List(Of sample) 
    Dim var1 As New sample 
    var1.Name = "test" 
    ListOfSample.Add(var1) 
    ListOfSample.Add(var1) 

    Dim NewListOfSample As New List(Of sample) 

    NewListOfSample.AddRange(ListOfSample) 
    NewListOfSample(1).Name = "test2" 

    Console.Write(NewListOfSample(0).Name & " " & NewListOfSample(1).Name) 
End Sub 

End Module 

Public Class sample 
    Public Name As String 
End Class 
+0

Это может быть полезно, если это не проблема: [http://stackoverflow.com/a/78612/1565525](http://stackoverflow.com/a/78612/1565525) – Fabio

+0

Ключевым моментом здесь является что вы * только * имеете один объект 'sample', и вы имеете его в обоих списках дважды. Таким образом, все ваши записи в списке относятся к одному и тому же объекту и изменяют один *, изменяя один объект *. – crashmstr

ответ

0

Поскольку ваш список представляет собой список объектов, при выполнении добавления диапазона вы не добавляете «копии», вместо этого вы добавляете указатели (ссылки) к тем же объектам, которые находятся в вашем исходном списке.

Вам нужно будет клонировать все ваши объекты в первом списке, а затем добавить эти клоны во второй список. Когда дело доходит до клонирования, в .NET существует несколько разных способов. Вот сообщение о получении глубоких копий объектов, которые хорошо описывают ваши варианты: Deep Copy of an Object

Вы можете создать метод клонирования на вашем «образце» объекта, чтобы вернуть новую инициализированную копию, или вы можете использовать некоторые из методов сериализации, упомянутых в сообщении, с которым я связан.

+0

Спасибо, это мне очень помогло! – cornholio

0

В строке NewListOfSample.AddRange(ListOfSample) вы добавляете ссылки в новый список. Так что все, что вы измените в новом списке, обновит ссылку в вашем исходном списке (они оба указывают на одни и те же объекты). Вам нужно добавить новые экземпляры Sample во второй список, чтобы он содержал независимые элементы.

Смежные вопросы