Коллекции .net: как копировать объекты из одной коллекции в другую? - PullRequest
2 голосов
/ 24 ноября 2011

Я реализую настроенный алгоритм Graph в vb.net, и у меня возникла следующая проблема:

Введите код:

dim col as new collection
dim myC as new system.collections.genericList(of myClass)

dim obj1 as new myClass
dim obj2 as new myClass

myC.add(obj1)
myC.add(obj2)

dim myC2 as new system.collections.generic.list(of myClass)

myC2 = myC

col.add(myc2)

'In the next statement, the myC2 inside col collection will be decreased to contain
'only obj1, like myC. I supose this is for myC and myC2 contains only a pointer to
'objects obj1 and obj2 as well col contains pointers to myC and myC2
myC.remove(obj2)

'The problem is that I have to only copy myC to myC2, like a ByVal argument in a function,
'instead a ByRef argument, in order to mantain a copy of objects in myC2 while these
'objects should be removed from myC. How should I do it?

Спасибо за помощь ...

Ответы [ 2 ]

8 голосов
/ 26 ноября 2011

Вы можете передать myC в качестве аргумента конструктору myC2:

Dim myC2 As New System.Collections.Generic.List(Of [MyClass])(myC)

Это инициализирует новый список с теми же элементами, что и myC.

1 голос
/ 24 ноября 2011

Я согласен, что ICloneable предоставляет лучший интерфейс для демонстрации поведения клонирования, но рекомендую заглянуть в AutoMapper для выполнения реальной работы.AutoMapper позволит вам динамически отображать типы без всего кода AZ = BZ.

И, при отображении одной коллекции в другую, AutoMapper автоматически создаст копии исходных элементов.Фактически, вы можете использовать оператор, подобный следующему, для создания второй коллекции на лету:

var secondCollection = Mapper.DynamicMap<Collection<Items>>(firstCollection);

Вы можете легко поместить это в метод ICloneable.Clone, например:

object ICloneable.Clone()
{
    return Mapper.DynamicMap<ThisType>(this);
}

(DynamicMap - это удобный метод, который позволяет отображать объекты без предварительного определения отображения. Это полезно, если вам не нужно определять какие-либо дельты при отображении, как это было бы в случае простого клонирования объекта.)

Это также хороший способ реализации Clone, когда вы работаете на платформах, которые не поддерживают тип BinaryFormatter, который обычно используется.

Надеюсь, это поможет.

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