簡單介紹C#中List<T>對象的深度拷貝問題

來源:互聯網
上載者:User
下面小編就為大家帶來一篇淺談C#中List<T>對象的深度拷貝問題。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

一、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";   } }}
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.