淺談C#中List<T>對(duì)象的深度拷貝問題
一、List<T>對(duì)象中的T是值類型的情況(int 類型等)
對(duì)于值類型的List直接用以下方法就可以復(fù)制:
List<T> oldList = new List<T>(); oldList.Add(..); List<T> newList = new List<T>(oldList);
二、List<T>對(duì)象中的T是引用類型的情況(例如自定義的實(shí)體類)
1、對(duì)于引用類型的List無法用以上方法進(jìn)行復(fù)制,只會(huì)復(fù)制List中對(duì)象的引用,可以用以下擴(kuò)展方法復(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中的對(duì)象要實(shí)現(xiàn)ICloneable接口
}
2、另一種用序列化的方式對(duì)引用對(duì)象完成深拷貝,此種方法最可靠
public static T Clone<T>(T RealObject)
{
using (Stream objectStream = new MemoryStream())
{
//利用 System.Runtime.Serialization序列化與反序列化完成引用對(duì)象的復(fù)制
IFormatter formatter = new BinaryFormatter();
formatter.Serialize(objectStream, RealObject);
objectStream.Seek(0, SeekOrigin.Begin);
return (T)formatter.Deserialize(objectStream);
}
}
3、利用System.Xml.Serialization來實(shí)現(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);
}
}
三、對(duì)上述幾種對(duì)象深拷貝進(jìn)行測(cè)試
測(cè)試如下:
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
相關(guān)文章
C語言數(shù)據(jù)結(jié)構(gòu)之迷宮問題
這篇文章主要為大家詳細(xì)介紹了C語言數(shù)據(jù)結(jié)構(gòu)之迷宮問題,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-03-03
C++實(shí)操之內(nèi)聯(lián)成員函數(shù)介紹
大家好,本篇文章主要講的是C++實(shí)操之內(nèi)聯(lián)成員函數(shù)介紹,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12
C++內(nèi)存泄漏的檢測(cè)與實(shí)現(xiàn)詳細(xì)流程
內(nèi)存泄漏(memory leak) 是指由于疏忽或錯(cuò)誤造成了程序未能釋放掉不再使用的內(nèi)存的情況。內(nèi)存泄漏并非指內(nèi)存在物理上的消失,而是應(yīng)用程序分配某段內(nèi)存后,由于設(shè)計(jì)錯(cuò)誤,失去了對(duì)該段內(nèi)存的控制,因而造成了內(nèi)存的浪費(fèi)2022-08-08
Opencv 視頻轉(zhuǎn)為圖像序列的實(shí)現(xiàn)
今天小編就為大家分享一篇Opencv 視頻轉(zhuǎn)為圖像序列的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-12-12
C語言實(shí)現(xiàn)時(shí)間處理工具的示例代碼
這篇文章主要為大家詳細(xì)介紹了利用C語言實(shí)現(xiàn)時(shí)間處理工具的相關(guān)資料,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下2022-09-09
c語言實(shí)現(xiàn)24小時(shí)制轉(zhuǎn)換為12小時(shí)制示例
這篇文章主要介紹了c語言實(shí)現(xiàn)24小時(shí)制轉(zhuǎn)換為12小時(shí)制示例,需要的朋友可以參考下2014-04-04

