2013-04-17 38 views
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); 

回答

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(); 
相關問題