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