国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C > 正文

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

2020-01-26 14:16:37
字體:
供稿:網(wǎng)友

一、List<T>對象中的T是值類型的情況(int 類型等)

對于值類型的List直接用以下方法就可以復(fù)制:

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

二、List<T>對象中的T是引用類型的情況(例如自定義的實體類)

1、對于引用類型的List無法用以上方法進(jìn)行復(fù)制,只會復(fù)制List中對象的引用,可以用以下擴展方法復(fù)制:

static class Extensions  {      public static IList<T> Clone<T>(this IList<T> listToClone) where T: ICloneable      {          return listToClone.Select(item => (T)item.Clone()).ToList();      }  //當(dāng)然前題是List中的對象要實現(xiàn)ICloneable接口 } 

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

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

3、利用System.Xml.Serialization來實現(xiàn)序列化與反序列化

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);      }}

三、對上述幾種對象深拷貝進(jìn)行測試

測試如下:

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對象的深度拷貝問題就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持武林網(wǎng)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 光山县| 闸北区| 浪卡子县| 蒲江县| 年辖:市辖区| 贵港市| 常德市| 屏东县| 绥德县| 怀化市| 沅陵县| 明光市| 云和县| 屯留县| 易门县| 咸丰县| 汕头市| 上饶县| 平潭县| 绥阳县| 营口市| 大理市| 新化县| 惠州市| 县级市| 南投市| 元朗区| 沙雅县| 平昌县| 荥阳市| 潜山县| 六枝特区| 康定县| 建宁县| 大荔县| 常山县| 贵阳市| 祁阳县| 项城市| 阿鲁科尔沁旗| 吐鲁番市|