C# でのリストのディープ コピー
C# でリストを直接割り当てる (例: List<T> list2 = list1;
)、または List<T> list2 = new List<T>(list1);
を使用すると、浅いコピーが作成されます。 一方のリストを変更すると、基になるオブジェクトが同じであるため、もう一方のリストにも影響します。一方のリストへの変更が他方のリストから独立した真のディープ コピーを作成するには、含まれているオブジェクトを複製する必要があります。その方法は次のとおりです:
方法 1: LINQ を使用する (推奨)
最も簡潔で効率的なアプローチは、LINQ の Select
メソッドを利用して、リスト内の各オブジェクトの新しいインスタンスを作成します。
<code class="language-csharp">List<Book> books_2 = books_1.Select(book => new Book(book.title)).ToList();</code>
この行は books_1
を反復処理し、既存の Book
を使用して要素ごとに新しい title
オブジェクトを作成し (Book
クラスにタイトルを取得するコンストラクターがあると仮定します)、結果のシーケンスを変換して戻します。新しい List<Book>
.
方法 2: ConvertAll
を使用する (代替)
ConvertAll
メソッドは、同じ結果を得るためにもう少し単純な構文を提供します。
<code class="language-csharp">List<Book> books_2 = books_1.ConvertAll(book => new Book(book.title));</code>
これにより、LINQ アプローチと同じディープ コピーが実現されます。 読みやすい方の方法を選択してください。
どちらの方法でも、books_2
が books_1
の完全に独立したディープ コピーであることが保証されます。どちらかのリストに変更を加えても、もう一方のリストには影響しません。 これは、Book
クラス (またはリストに含まれる型) が新しいインスタンスの作成を容易にする適切なコンストラクターを持っていることを前提としていることに注意してください。 Book
クラスにさらに多くのプロパティがある場合は、それに応じてそれらを new Book(...)
コンストラクター呼び出しに含める必要があります。
以上がC# でリストのディープ コピーを作成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。