我知道你可以给列表对象作为列表构造函数的参数来将1个列表复制到另一个列表。
通过这样做,如果使用的类型是简单的内置一次(准确地说是什么?),您可以创建一个深层副本。例如类型字符串:
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 );
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();
副本不仅浅或深。它是一个具有多个值的标度,具有“最深”和“最浅”选项。只使用列表的复制构造函数会产生一个位于中间位置的副本;它不是“深层复制品”。
你正在做的是重新创建一个新列表,而不复制对它的引用,但你正在对该列表中的项目执行浅表复制。如果内部列表中的项目本身就是列表或其他可变引用类型,则需要对它们及其所有引用字段等进行深层复制,直到链中。这将是一个真正“深刻”的副本。这样做是非平凡的,在一般情况下是不可能的。没有真正有效的方法为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();