2012-12-07 36 views
1

可能重複:
How do I clone a generic list in C#?複製列表到另一個(新名單不應該參照舊列表)

我想要的清單在C#中複製到另一個。問題是像copyto這樣的現有方法會從另一個列表中創建一個新列表。但是,如果我對新列表進行一些更改,舊列表也會發生變化。因爲它們的引用類型行爲。如果有任何方法(除了foreach循環)從另一個列表創建一個新的列表,將不會引用同一個對象

+1

這就是所謂的「深度克隆」。 – leppie

+0

是的,問題是深拷貝與淺拷貝。它實際上是編程語言中的一大堆蠕蟲。有標準的克隆方法,但是它們在淺層和深層方面有不同的實現,並且從子類到子類相對不一致。我懷疑你最好使用for循環,除非你對集合實現是你的一些信心。 –

回答

15

所以你想要的是列表的深層副本 - 其中第二個列表包含第一個列表的元素。在這種情況下,當任何列表的元素髮生變化時,另一個列表保持不變。

如何做到這一點,取決於列表中的元素是引用類型還是值類型。值類型列表可以很容易地克隆像這樣:

List<int> deepCopy = new List<int>(originalList); 

對於引用類型列表中,您可以使用序列化,像這樣:

public List<MyObject> DeepCopy() 
{ 
    MemoryStream ms = new MemoryStream(); 
    BinaryFormatter bf = new BinaryFormatter(); 
    bf.Serialize(ms, this); 

    ms.Position = 0; 
    return (List<MyObject>) bf.Deserialize(ms); 
} 
相關問題