C# でオブジェクトの汎用リストがあり、そのリストを複製したいと考えています。リスト内の項目は複製可能ですが、それを実行するオプションがないようですlist.Clone()
。
これを回避する簡単な方法はありますか?
ベストアンサー1
要素が値型の場合は、次のようにします。
List<YourType> newList = new List<YourType>(oldList);
ただし、参照型であり、ディープコピーが必要な場合 (要素が を適切に実装していると仮定ICloneable
)、次のようにすることができます。
List<ICloneable> oldList = new List<ICloneable>();
List<ICloneable> newList = new List<ICloneable>(oldList.Count);
oldList.ForEach((item) =>
{
newList.Add((ICloneable)item.Clone());
});
当然のことながら、ICloneable
上記のジェネリックを置き換えて、 を実装する要素型にキャストしますICloneable
。
要素型がコピー コンストラクターをサポートしていないICloneable
が、コピー コンストラクターを持っている場合は、代わりに次のようにすることができます。
List<YourType> oldList = new List<YourType>();
List<YourType> newList = new List<YourType>(oldList.Count);
oldList.ForEach((item)=>
{
newList.Add(new YourType(item));
});
個人的には、すべてのメンバーのディープコピーを保証する必要があるため、 は避けます。 代わりに、の新しいインスタンスを返すICloneable
コピーコンストラクターまたはそのようなファクトリメソッドをお勧めします。YourType.CopyFrom(YourType itemToCopy)
YourType
これらのオプションはいずれも、メソッド (拡張機能など) によってラップできます。