在下面的代码中,
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()
所做的那样简洁、快速和简单的解决方案。方法。
帮助者真正了不起的是使用我的代码并用可行的解决方案修改它,以便它可以编译和工作。我认为这将真正帮助新手尝试理解为这个问题提供的解决方案。
编辑:请注意 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# - 如何创建 List<T> 的新深拷贝(克隆)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14007405/