淺談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)行測試
測試如下:
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)文章
Qt中QList與QLinkedList類的常用方法總結(jié)
這篇文章主要為大家詳細(xì)介紹了Qt中QList與QLinkedList類的常用方法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Qt有一定的幫助,需要的可以參考一下2022-12-12
C語言實(shí)現(xiàn)訪問及查詢MySQL數(shù)據(jù)庫的方法
這篇文章主要介紹了C語言實(shí)現(xiàn)訪問及查詢MySQL數(shù)據(jù)庫的方法,涉及C語言基于libmysql.lib實(shí)現(xiàn)訪問MySQL數(shù)據(jù)庫的相關(guān)操作技巧,需要的朋友可以參考下2018-01-01
C語言實(shí)現(xiàn)簡易學(xué)生管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)簡易學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06
c語言中回調(diào)函數(shù)的使用以及實(shí)際作用詳析
回調(diào)函數(shù)就是一個(gè)通過函數(shù)指針調(diào)用的函數(shù),如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個(gè)函數(shù),當(dāng)這個(gè)指針被用來調(diào)用其所指向的函數(shù)時(shí),我們就說這是回調(diào)函數(shù),這篇文章主要給大家介紹了關(guān)于c語言中回調(diào)函數(shù)的使用以及實(shí)際作用的相關(guān)資料,需要的朋友可以參考下2021-07-07
C++虛繼承的實(shí)現(xiàn)原理由內(nèi)存布局開始講起
為了解決多繼承時(shí)的命名沖突和冗余數(shù)據(jù)問題,C++提出了虛繼承,使得在派生類中只保留一份間接基類的成員,下面我們從內(nèi)存布局看看虛繼承的實(shí)現(xiàn)原理2022-06-06

