在下面的一段代码,如何创建列表的新深层副本(克隆)<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>
,我有几个项目给他们一个独特的标题(从“一”到“十二五”)来填充它。
然后我创建List<Book> books_2 = new List<Book>(books_1)
。
从这一点来说,我知道它是列表对象的克隆,但是book_2
的书对象仍然是来自books_1
中书对象的参考。通过对books_2
的两个第一个元素进行更改,然后在TextBox
中检查book_1
的那些相同元素,证明了这一点。
books_1[0].title and books_2[1].title
确实已更改为books_2[0].title and books_2[1].title
的新值。
现在的问题
我们如何创建一个List<T>
的一个新的硬拷贝?这个想法是,books_1
和books_2
变得完全独立于彼此。
我很失望微软并没有提供一个整洁,快速和简单的解决方案,就像Ruby正在使用clone()
方法一样。
会从佣工真正真棒什么是用我的代码和一个可行的方案改变它,所以它可以编译和工作。我认为这将真正帮助新手试图理解为这个问题提供的解决方案。
编辑:请注意,Book
类可能更加复杂,并有更多的属性。我试图保持简单。
类似'CopyTo'? –
这种类型的复制通常称为[深层复制](http://en.wikipedia。组织/维基/ DEEP_COPY#DEEP_COPY)。如果您觉得“硬拷贝”与您实际需要的东西不同 - 请撤消我的编辑并添加您对该术语的定义。 –
[硬拷贝](http://en.wikipedia.org/wiki/Hard_copy)表示您将其打印到实际的纸张上。 –