C# 包含类元素的列表的深度副本

C# 包含类元素的列表的深度副本,c#,list,deep-copy,C#,List,Deep Copy,编辑: 给那个把问题标记为重复的人。这个问题是关于如何创建深度副本的。我的问题是如何确保在复制类元素列表时调用复制构造函数 我正在尝试创建包含自定义类元素的列表的深度副本。如果我有一个字符串列表,我可以直接使用它 List<string> secondList = new List<string>(firstList); 我的程序所做的就是这样 TestClass t = new TestClass("Name1"); List<TestClass> lis

编辑: 给那个把问题标记为重复的人。这个问题是关于如何创建深度副本的。我的问题是如何确保在复制类元素列表时调用复制构造函数

我正在尝试创建包含自定义类元素的列表的深度副本。如果我有一个字符串列表,我可以直接使用它

List<string> secondList = new List<string>(firstList);
我的程序所做的就是这样

TestClass t = new TestClass("Name1");
List<TestClass> list1 = new List<TestClass>();
list1.Add(t);

List<TestClass> list2 = new List<TestClass>(list1);
list2[0].name = "Name2";
TestClass t=newtestclass(“Name1”);
List list1=新列表();
清单1.添加(t);
列表2=新列表(列表1);
列表2[0]。name=“Name2”;

最后一行代码更改了两个列表中第一个元素的名称,我不希望这样。

这里的问题是,您的对象是引用类型,而列表包含对这些对象的引用

这意味着,即使第二个列表中有第一个列表中引用的副本,引用仍然指向原始对象

为了解决这个问题,您必须克隆存储在列表中的实际对象,而不是列表中的引用

您已经为类定义了一个副本构造函数,因此可以使用该构造函数制作列表的深度副本,如下所示:

var list2 = list1.Select(item => new TestClass(item)).ToList();

这里的问题是,您的对象是引用类型,而列表包含对这些对象的引用

这意味着,即使第二个列表中有第一个列表中引用的副本,引用仍然指向原始对象

为了解决这个问题,您必须克隆存储在列表中的实际对象,而不是列表中的引用

您已经为类定义了一个副本构造函数,因此可以使用该构造函数制作列表的深度副本,如下所示:

var list2 = list1.Select(item => new TestClass(item)).ToList();

使用以下代码行创建引用:

List<TestClass> list2 = new List<TestClass>(list1);
List list2=新列表(list1);
但是你不会喜欢使用callbyreference。您需要按值调用 在这种方法中

因此,lambda表达式中的工作代码如下所示:

        TestClass t = new TestClass("Name1");
        List<TestClass> list1 = new List<TestClass>();
        list1.Add(t);

        List<TestClass> list2 = new List<TestClass>();
        list2 = list1.Select(item => new TestClass(item)).ToList();
        list2[0].name = "Name2";
TestClass t=newtestclass(“Name1”);
List list1=新列表();
清单1.添加(t);
List list2=新列表();
list2=list1.Select(item=>newtestclass(item)).ToList();
列表2[0]。name=“Name2”;

玩得开心…

您可以使用以下代码行创建引用:

List<TestClass> list2 = new List<TestClass>(list1);
List list2=新列表(list1);
但是你不会喜欢使用callbyreference。您需要按值调用 在这种方法中

因此,lambda表达式中的工作代码如下所示:

        TestClass t = new TestClass("Name1");
        List<TestClass> list1 = new List<TestClass>();
        list1.Add(t);

        List<TestClass> list2 = new List<TestClass>();
        list2 = list1.Select(item => new TestClass(item)).ToList();
        list2[0].name = "Name2";
TestClass t=newtestclass(“Name1”);
List list1=新列表();
清单1.添加(t);
List list2=新列表();
list2=list1.Select(item=>newtestclass(item)).ToList();
列表2[0]。name=“Name2”;

玩得开心…

Try:
list2=list1.Select(x=>newtestclass(x)).ToList()
Try的可能副本:
list2=list1.Select(x=>newtestclass(x)).ToList()的可能副本