淺談C#中List<T>對象的深度拷貝問題

來源:互聯網
上載者:User
一、List<T>對象中的T是實值型別的情況(int 類型等)

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

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

二、List<T>對象中的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對象的深度拷貝問題就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援topic.alibabacloud.com。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.