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

问题描述 投票:2回答:2

我知道你可以给列表对象作为列表构造函数的参数来将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 );
c# list deep-copy
2个回答
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
投票

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

你正在做的是重新创建一个新列表,而不复制对它的引用,但你正在对该列表中的项目执行浅表复制。如果内部列表中的项目本身就是列表或其他可变引用类型,则需要对它们及其所有引用字段等进行深层复制,直到链中。这将是一个真正“深刻”的副本。这样做是非平凡的,在一般情况下是不可能的。没有真正有效的方法为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();
© www.soinside.com 2019 - 2024. All rights reserved.