2011-11-24 3 views
2

나는 vb.net에서 사용자 정의 그래프 알고리즘을 구현하고있어, 나는 다음과 같은 문제에 봉착 :.net collections : 한 컬렉션에서 다른 컬렉션으로 개체를 복사하는 방법은 무엇입니까?

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

당신은 myC2의 생성자에 인수로 MYC를 전달할 수 있습니다 :이 MYC와 같은 요소로 새로운 목록을 초기화합니다

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

.

+0

완전히 간단하고 훌륭합니다! 고마워요! – Alex

1

ICloneable이 복제 동작을 노출시키는 최상의 인터페이스를 제공하지만 실제 작업을 수행하기 위해 AutoMapper를 조사하는 것이 좋습니다. AutoMapper를 사용하면 A.Z = B.Z 코드를 모두 사용하지 않고도 동적으로 유형을 매핑 할 수 있습니다.

컬렉션을 매핑 할 때 AutoMapper는 자동으로 원본 항목의 복사본을 만듭니다. 사실, 당신은 유사한 문을 사용할 수있는 즉석에서 두 번째 컬렉션을 만들려면 다음

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

:

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

당신은 쉽게 같은 ICloneable.Clone 방법 안에이 넣을 수를 (DynamicMap은 매핑을 미리 정의하지 않고도 객체를 매핑 할 수있는 편리한 메소드로 객체를 단순히 복제 할 때처럼 매핑 할 때 델타를 정의 할 필요가없는 경우 유용합니다.)

This 또한 clone을 구현할 때 좋은 방법입니다. e 일반적으로 사용되는 BinaryFormatter를 지원하지 않는 플랫폼에서 작업합니다.

희망이 있습니다.

+1

Framework 디자인 가이드 라인에서 ICloneable을 구현하지 않는 것이 좋습니다. 그 이유는 딥 - 카피 (deep-copy) 또는 얕은 카피 (shallow-copy)인지 여부를 지정하지 않기 때문입니다. – TrueWill

+0

사실, 이것은 당신이 결정해야하는 표준입니다 (지침은 지침 사항입니다). 대부분은 깊은 사본이라고 생각합니다. 필자는 새로운 ID를 사용하여 엔티티의 복사본을 생성하는 엔티티 (ID가있는)와 함께 사용하는 유사한 ICopyable 인터페이스를 구현했습니다. – SonOfPirate

관련 문제