您可以通过使用它的构造函数来创建嵌套列表的深层副本吗?

时间:2013-04-17 19:35:28

标签: c# list deep-copy

我知道您可以将列表对象作为列表构造函数的参数提供给复制 1列表到另一个列表。

通过这样做,您可以创建深层复制,如果使用的类型是简单内置一次(哪个正好?)。例如类型 string

List<string> testList = new List<string>();

List<string> testListCopy = new List<string>(testList );

如果您使用嵌套列表,是否可以创建深层副本? :

List<List<string>> testList = new List<List<string>>();

List<List<string>> testListCopy = new List<List<string>>(testList );

2 个答案:

答案 0 :(得分:4)

List<T>构造函数不会为您执行此操作,但您可以自己执行以下操作:

List<List<string>> testList = new List<List<string>>();
List<List<string>> testListCopy = new List<List<string>>(testList.Select(x => x.ToList()));

甚至这个,相当于:

List<List<string>> testListCopy = testList.Select(x => x.ToList()).ToList();

答案 1 :(得分:1)

副本不仅浅或深。它是一个具有多个值的标度,具有“最深”和“最浅”选项。只使用列表的复制构造函数会产生一个位于中间位置的副本;它不是“深层复制品”。

您正在做的是重新创建新列表,而不复制对它的引用,但您正在对该列表中的项目执行浅层复制。如果内部列表中的项目本身就是列表或其他可变引用类型,则需要对它们及其所有引用字段等进行深层复制,直到链中。这将是一个真正“深刻”的副本。这样做是非平凡的,在一般情况下是不可能的。没有真正有效的方法来编写适用于任何类型的public static T DeepCopy<T>(T object)实现。 (您可以尝试利用序列化,但不是所有对象都可以序列化)。

至于List<List<string>>的具体情况,您只需创建一个新的外部列表,以及每个内部列表的新列表。 P.s.w.g对这个特殊问题给出了good answer

List<List<string>> listCopy = list.Select(x => x.ToList()).ToList();