c# - 如何创建 List<T> 的新深拷贝(克隆)?

标签 c# list clone deep-copy

在下面的代码中,

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

关于c# - 如何创建 List<T> 的新深拷贝(克隆)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14007405/

相关文章:

c# - 数据网格拖放目标 : Change Icon depending on the drop target

c# - JsonPropertyAttribute 中的 JSON.NET NullValueHandling 未按预期工作

c# - 如何在 conversionType 为可为空的 int 时使用 Convert.ChangeType()

javascript - 从文档中删除一个 dom 元素,但将其保存为变量?

来自分支的 Mercurial 克隆

c# - .Net Core - IConfigurationRoot 读取整个 json 文件

excel - 如何将 Matlab 中的多个列表写入同一个 excel 文件?

python - 从我的类(class)打印列表(python)

android - Android 中的自定义 ListView,图标和文本不起作用

java - Java中 map 的浅拷贝