在下面的一段代碼,如何創建列表的新深層副本(克隆)<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)表示您將其打印到實際的紙張上。 –