В следующем фрагменте кода
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>
, и я заполняю его несколькими элементами, давая им уникальный заголовок (от "одного" до "пятого" ).
Затем я создаю List<Book> books_2 = new List<Book>(books_1)
.
С этого момента я знаю, что это клон объекта списка, но объекты книги из 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()
.
То, что действительно было бы полезно от помощников, - это использовать мой код и изменить его с помощью рабочего решения, чтобы его можно было скомпилировать и работать. Я думаю, что это действительно поможет новичкам, пытающимся понять предлагаемые решения для этой проблемы.
EDIT: обратите внимание, что класс Book
может быть более сложным и иметь больше свойств. Я старался, чтобы все было просто.