C# でジェネリック リストを複製するにはどうすればよいですか? 質問する

C# でジェネリック リストを複製するにはどうすればよいですか? 質問する

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

これらのオプションはいずれも、メソッド (拡張機能など) によってラップできます。

おすすめ記事