復制 ArrayList 的時候,使用 ArrayList.Clone() 方法復制出來的新 ArrayList 之中元素的值會隨著源 ArrayList 中元素的值發生變化而一起改變。
查 MSDN:集合的淺表副本僅復制集合的元素(不論它們是引用類型還是值類型),但不復制引用所引用的對象。新集合中的引用與原始集合中的引用指向相同的對象。與之相對,集合的深層副本將復制這些元素以及由它們直接或間接引用的所有內容。
ArrayList.Clone() 返回值是 ArrayList 的淺表副本。
上網查了一下,大多數是新建一個實例,逐條復制 property,使用 for 實現:
for (int i = 0; i < arraylist1.Count; i++)
{
Class t = new Class(); // Class是類名
// 下面這句,若類 Class 中若有很多 Property,就要寫很多行
t.property = (Class)arraylist1[i].property;
arraylist2.Add(t);
}
我們知道,對於自定義的類,一般通過繼承 ICloneable接口,重寫 Clone() 方法來自己實現深拷貝。
因此如果類有繼承 ICloneable 接口,也可以這麼寫:
for (int i = 0; i < list1.Count; i++)
{
// Clone()返回類型為Object,因此還要轉換
list2.Add( (Class)( ((ICloneable)list1[i]).Clone() ) );
}
另外讓類實現 ISerializable 接口,通過序列化反序列化,我試了一下沒有問題:
MemoryStream ms = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(ms,list1); // list1中元素的類要實現ISerializable接口
ms.Seek(0, SeekOrigin.Begin);
ArrayList list2 = (ArrayList)bf.Deserialize(ms);
對於 ICollection,應該都差不多吧。