首頁  >  文章  >  後端開發  >  淺談C#中List物件的深度拷貝問題

淺談C#中List物件的深度拷貝問題

高洛峰
高洛峰原創
2017-01-19 13:09:481432瀏覽

一、List物件中的T是值型別的情況(int 型別等)

對於值型別的List直接用以下方法就可以複製:

List<T> oldList = new List<T>();
oldList.Add(..);
List<T> newList = new List<T>(oldList);

二、List物件中的T是引用型別的情況(例如自訂的實體類別)

1、對於引用型別的List無法用以上方法複製,只會複製List中物件的引用,可以用以下擴充方法複製:

static class Extensions
 {
     public static IList<T> Clone<T>(this IList<T> listToClone) where T: ICloneable
     {
         return listToClone.Select(item => (T)item.Clone()).ToList();
     }
 //当然前题是List中的对象要实现ICloneable接口
 }

2、另一種以序列化的方式對引用對象完成深拷貝,此種方法最可靠

public static T Clone<T>(T RealObject)
 
{
   using (Stream objectStream = new MemoryStream())
   {
      //利用 System.Runtime.Serialization序列化与反序列化完成引用对象的复制
       IFormatter formatter = new BinaryFormatter();
       formatter.Serialize(objectStream, RealObject);
       objectStream.Seek(0, SeekOrigin.Begin);
       return (T)formatter.Deserialize(objectStream);
   }
}

3、利用System.Xml.Serialization來實現序列化與反序列化

public static T Clone<T>(T RealObject)
{
      using(Stream stream=new MemoryStream())
      {
        XmlSerializer serializer = new XmlSerializer(typeof(T));
        serializer.Serialize(stream, RealObject);
        stream.Seek(0, SeekOrigin.Begin);
        return (T)serializer.Deserialize(stream);
      }
}

、對上述幾種物件深拷貝進行測試

測試如下:

using System;
using System.Collections.Generic;
using System.Collections ;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
 
namespace LINQ
{
  [Serializable]
  public class tt
  {
    private string name = "";
 
    public string Name
    {
      get { return name; }
      set { name = value; }
    }
    private string sex = "";
 
    public string Sex
    {
      get { return sex; }
      set { sex = value; }
    }
  }
 
  class LINQTest
  {
    public static T Clone<T>(T RealObject)
    {
      using (Stream objectStream = new MemoryStream())
      {
        IFormatter formatter = new BinaryFormatter();
        formatter.Serialize(objectStream, RealObject);
        objectStream.Seek(0, SeekOrigin.Begin);
        return (T)formatter.Deserialize(objectStream);
      }
    }
 
 
    public static void Main()
    {
      List<tt> lsttt = new List<tt>();
      tt tt1 = new tt();
      tt1.Name = "a1";
      tt1.Sex = "20";
      lsttt.Add(tt1);
      List<tt> l333 = new List<tt>();
      l333.Add(Clone<tt>(lsttt[0]));
      l333[0].Name = "333333333";
   }
 }
}

以上這篇淺談C#中List對象的深度拷貝問題就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持PHP中文網。

更多淺談C#中List物件的深度拷貝問題相關文章請關注PHP中文網!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn