2011-11-24 90 views
2

我執行在vb.net定製的圖形算法,我有以下問題:.net集合:如何將對象從一個集合複製到另一個集合?

Supose代碼:

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? 

感謝您的幫助......

回答

8

您可以通過MYC作爲參數傳遞給MYC2的構造函數:

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

這將初始化用相同的元素MYC一個新的列表。

+0

完全簡單和偉大!非常感謝! – Alex

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); 
} 

(動態地圖是一種方便的方法,可以在不預先定義映射的情況下映射對象,如果在映射時不需要定義任何增量,就像在簡單地克隆對象時一樣)。

這個也是在你實施克隆時的一個好方法e在不支持通常使用的BinaryFormatter的平臺上工作。

希望有所幫助。

+1

Microsoft建議不要實施ICloneable(在框架設計指南中)。原因是它沒有指定它是深拷貝還是淺拷貝。 – TrueWill

+0

沒錯,這是一個您必須確定的標準(準則是指導原則)。大多數人認爲這是一個深層次的複製。我已經實現了一個類似的ICopyable接口,我使用實體(具有身份),它將創建具有新身份的實體副本。 – SonOfPirate

相關問題