一尘不染

如何创建列表的新深层副本(克隆)?

c#

在下面的代码中,

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_1TextBox

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该类可能更复杂并且具有更多属性。我试图使事情简单。


阅读 209

收藏
2020-05-19

共1个答案

一尘不染

您需要创建新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));
2020-05-19