1
可能重複:
How do I clone a generic list in C#?複製列表到另一個(新名單不應該參照舊列表)
我想要的清單在C#中複製到另一個。問題是像copyto
這樣的現有方法會從另一個列表中創建一個新列表。但是,如果我對新列表進行一些更改,舊列表也會發生變化。因爲它們的引用類型行爲。如果有任何方法(除了foreach
循環)從另一個列表創建一個新的列表,將不會引用同一個對象
可能重複:
How do I clone a generic list in C#?複製列表到另一個(新名單不應該參照舊列表)
我想要的清單在C#中複製到另一個。問題是像copyto
這樣的現有方法會從另一個列表中創建一個新列表。但是,如果我對新列表進行一些更改,舊列表也會發生變化。因爲它們的引用類型行爲。如果有任何方法(除了foreach
循環)從另一個列表創建一個新的列表,將不會引用同一個對象
所以你想要的是列表的深層副本 - 其中第二個列表包含第一個列表的元素。在這種情況下,當任何列表的元素髮生變化時,另一個列表保持不變。
如何做到這一點,取決於列表中的元素是引用類型還是值類型。值類型列表可以很容易地克隆像這樣:
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);
}
這就是所謂的「深度克隆」。 – leppie
是的,問題是深拷貝與淺拷貝。它實際上是編程語言中的一大堆蠕蟲。有標準的克隆方法,但是它們在淺層和深層方面有不同的實現,並且從子類到子類相對不一致。我懷疑你最好使用for循環,除非你對集合實現是你的一些信心。 –