如何克隆通用List <t>而不作为参考?

时间:2016-09-01 08:11:27

标签: c# generics clone

我在C#中有一个通用的对象列表,并希望克隆列表。

List<Student> listStudent1 = new List<Student>();
List<Student> listStudent2 = new List<Student>();

我在下面使用了一个扩展方法,但它不能: (当listStudent2中的更改 - >影响listStudent1时)

public static List<T> CopyList<T>(this List<T> oldList)
{
    var newList = new List<T>(oldList.Capacity);
    newList.AddRange(oldList);

    return newList;
}

我想继续在listStudent2 中添加元素或进行更改,而不会影响listStudent1 。 我该怎么做?

1 个答案:

答案 0 :(得分:3)

您需要进行深度克隆。也就是克隆Student对象。否则你有两个单独的名单,但两者仍指向同一个学生。

您可以在CopyList方法中使用Linq

var newList = oldList.Select(o => 
                new Student{
                             id = o.id // Example
                            // Copy all relevant instance variables here
                            }).toList()

您可能想要做的是让您的学生课程能够创建自己的克隆,这样您就可以在选择中使用它而不是在那里创建新学生。

这看起来像是:

public Student Copy() {
        return new Student {id = this.id, name = this.name};
    }

在你的学生班内。

然后你只需写

var newList = oldList.Select(o => 
                o.Copy()).toList();
方法中的