[解決済み] List<T>のクローンを作るには?
質問
次のようなコードになります。
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
namespace clone_test_01
{
public partial class MainForm : Form
{
public class Book
{
public string title = "";
public Book(string title)
{
this.title = title;
}
}
public MainForm()
{
InitializeComponent();
List<Book> books_1 = new List<Book>();
books_1.Add( new Book("One") );
books_1.Add( new Book("Two") );
books_1.Add( new Book("Three") );
books_1.Add( new Book("Four") );
List<Book> books_2 = new List<Book>(books_1);
books_2[0].title = "Five";
books_2[1].title = "Six";
textBox1.Text = books_1[0].title;
textBox2.Text = books_1[1].title;
}
}
}
を使っています。
Book
オブジェクト型を使用して
List<T>
を作成し、それにユニークなタイトル('1'から'5'まで)を付けたいくつかの項目を入力します。
次に
List<Book> books_2 = new List<Book>(books_1)
.
この時点から、リストオブジェクトのクローンであることはわかりますが、 BUT のブックオブジェクトは
book_2
にある本オブジェクトからの参照であることに変わりはありません。
books_1
. の最初の二つの要素を変更することで証明されます。
books_2
の同じ要素をチェックし
book_1
の中で
TextBox
.
books_1[0].title and books_2[1].title
は確かに新しい値に変更されています。
books_2[0].title and books_2[1].title
.
では、質問です。
の新しいハードコピーをどのように作成するのでしょうか?
List<T>
? 考え方としては
books_1
と
books_2
は互いに完全に独立したものになります。
私は、Microsoft が Ruby が行っているような、きちんとした、速くて簡単な解決策を提供しなかったことに失望しています。
clone()
メソッドで行っているようなきちんとした、速くて簡単なソリューションを提供しなかったことに失望しています。
ヘルパーから本当に素晴らしいことは、私のコードを使用して、コンパイルして動作できるように実行可能な解決策でそれを変更することです。私は、それがこの問題に対して提供された解決策を理解しようとする初心者を本当に助けると思います。
編集: 注意点として
Book
クラスはより複雑で、より多くのプロパティを持つことができます。私は物事をシンプルに保つよう努めました。
どのように解決するのですか?
新しい
Book
オブジェクトを作成し、それを新しい
List
:
List<Book> books_2 = books_1.Select(book => new Book(book.title)).ToList();
更新: 少しシンプルに...
List<T>
というメソッドがあります。
ConvertAll
というメソッドがあり、新しいリストを返します。
List<Book> books_2 = books_1.ConvertAll(book => new Book(book.title));
関連
-
[解決済み】 C# 条件演算子エラー 代入、call、increment、decrement、await、new object 式のみ文として使用可能です。
-
[解決済み] JavaScriptでオブジェクトをディープクローンする最も効率的な方法は何ですか?
-
[解決済み] リストのリストからフラットなリストを作るには?
-
[解決済み] リストが空かどうかを確認するにはどうすればよいですか?
-
[解決済み] 割り当て後にリストが予期せず変更されました。その理由と防止策を教えてください。
-
[解決済み] リストを均等な大きさの塊に分割するには?
-
[解決済み] リストの最後の要素を取得する方法
-
[解決済み] リストの要素数を取得する方法
-
[解決済み] リストからランダムに項目を選択するにはどうすればよいですか?
-
[解決済み] なぜList<T>を継承しないのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] [Entity Framework 4.1でエンティティに関連オブジェクトを追加する際に、エンティティオブジェクトをIEntityChangeTracker.の複数のインスタンスから参照できない。
-
[解決済み】パディングが無効で、削除できない?
-
[解決済み] エンティティタイプ <type> は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み】ソケットのアドレス(プロトコル/ネットワークアドレス/ポート)は、通常1つしか使用できない?
-
[解決済み】バックスラッシュを含むパス文字列のエスケープシーケンスが認識されない件
-
[解決済み】Unity3DでOnTriggerEnterが動作しない件
-
[解決済み】値が期待した範囲に収まらない
-
[解決済み】EF 5 Enable-Migrations : アセンブリにコンテキストタイプが見つかりませんでした
-
[解決済み】値をNULLにすることはできません。パラメータ名:source
-
[解決済み] 2つのリストを結合する