程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> ArrayList深層復制

ArrayList深層復制

編輯:.NET實例教程
復制 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,應該都差不多吧。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved