1. ホーム
  2. c#

[解決済み] List<T>のクローンを作るには?

2023-07-07 19:58:11

質問

次のようなコードになります。

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_1books_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));