我知道您可以将列表对象作为列表构造函数的参数提供给复制 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 );
答案 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();