如何制作对象列表的深层副本

时间:2016-02-01 11:50:34

标签: c# list object copy deep-copy

嗨我有一个对象列表(list1),我想复制一下这个列表,但我希望第二个列表(list2)中的对象不要链接到第一个列表中的对象。

这就是我的工作

    list<Obj> list1 = new list<Obj>{};
    // I fill the list1 with objects Obj
    // now I want to make a deep copy this is what I do

   list<Obj>  list2 = new list<Obj>(list1);
   // but when I edit an object in list 1 I also edit the object in list2

我希望能够编辑list1中的对象而无需编辑list2中的对象,我该怎么做?

感谢您的回答

2 个答案:

答案 0 :(得分:2)

您应该在Obj课程中实施ICloneable界面。之后,您可以调用此代码来创建第二个列表:

list<Obj>  list2 = new list<Obj>(list1.Select(x => x?.Clone()));

它将克隆列表中的每个项目。 (使用空检查)

答案 1 :(得分:1)

您可以将复制构造函数添加到Obj

然后循环遍历list1,使用复制构造函数创建对象的新实例,并将其添加到list2。

示例:

复制构造函数:

public Obj(Obj copyFrom)
{
   this.field1 = copyFrom.field1;
   .
   .
}

使用以下LINQ查询,您可以使用上述构造函数:

list2.AddRange(list1.Select(s => new Obj(s)));