.net collections:あるコレクションから別のコレクションにオブジェクトをコピーする方法は?

私は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

2 答え

myCをmyC2のコンストラクタの引数として渡すことができます:

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

これにより、myCと同じ要素を持つ新しいリストが初期化されます。

8
追加された
全く単純で素晴らしい!どうもありがとう!
追加された 著者 Alex,

私はICloneableがクローン動作を公開するための最良のインターフェースを提供しているが、実際の作業を行うためにAutoMapperを検討することを推奨します。 AutoMapperを使用すると、A.Z = B.Zコードのすべてを使用せずにタイプを動的にマップすることができます。

コレクションを別のコレクションにマッピングすると、AutoMapperはソースアイテムのコピーを自動的に作成します。実際には、次のような文を使用して、オンザフライで2番目のコレクションを作成できます。

var secondCollection = Mapper.DynamicMap>(firstCollection);

これをICloneable.Cloneメソッドの中に簡単に入れることができます:

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

(DynamicMapは、マッピングを事前に定義することなくオブジェクトをマッピングできる便利な方法です。これは、単にオブジェクトを複製する場合のようにマッピングする際にデルタを定義する必要がない場合に便利です)。

これは、一般的に使用されているBinaryFormatterをサポートしていないプラットフォームで作業しているときに、Cloneを実装するための良い方法です。

希望が役立ちます。

1
追加された
実際、これはあなたが決定しなければならない標準です(ガイドラインはガイドラインです)。大部分は深いコピーであると考えます。私は、新しいアイデンティティを持つエンティティのコピーを作成するエンティティ(IDを持つ)で使用するのと同様のICopyableインターフェイスを実装しました。
追加された 著者 SonOfPirate,
ICloneableは実装されないことをお勧めします(Framework Design Guidelines)。その理由は、ディープコピーかシャローコピーかを指定していないからです。
追加された 著者 TrueWill,