3

我知道您可以将列表对象作为列表构造函数的参数,以将 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 );
4

2 回答 2

6

构造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();
于 2013-04-17T19:36:51.240 回答
1

副本不只是浅的或深的。这是一个带有多个值的刻度,带有“最深”和“最浅”的选项。仅使用列表的复制构造函数会导致位于中间某处的副本;它不是“深拷贝”。

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

至于 a 的具体情况List<List<string>>,您只需要创建一个新的外部列表,以及每个内部列表的新列表。Pswg对这个特定问题给出了一个很好的答案:

List<List<string>> listCopy = list.Select(x => x.ToList()).ToList();
于 2013-04-17T19:42:41.803 回答