我在vb.net中实现了一个自定义的Graph算法,我遇到了以下问题:
使用代码:
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?
感谢您的帮助...
答案 0 :(得分:8)
您可以将myC作为参数传递给myC2的构造函数:
Dim myC2 As New System.Collections.Generic.List(Of [MyClass])(myC)
这将使用与myC相同的元素初始化一个新列表。
答案 1 :(得分:1)
我同意ICloneable提供了揭示克隆行为的最佳界面,但建议您查看AutoMapper以执行实际工作。 AutoMapper将允许您动态映射类型而不需要所有A.Z = B.Z代码。
并且,在将一个集合映射到另一个集合时,AutoMapper将自动创建源项目的副本。实际上,您可以使用类似于以下的语句来动态创建第二个集合:
var secondCollection = Mapper.DynamicMap<Collection<Items>>(firstCollection);
您可以轻松地将其放入ICloneable.Clone方法中,如:
object ICloneable.Clone()
{
return Mapper.DynamicMap<ThisType>(this);
}
(DynamicMap是一种方便的方法,它允许您在不事先定义映射的情况下映射对象。如果您不必在映射时定义任何增量,这就像在简单克隆对象时一样。)
当您在不支持通常使用的BinaryFormatter的平台上工作时,这也是实现Clone的好方法。
希望有所帮助。