一、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無(wú)法用以上方法進(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來(lái)實(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
新聞熱點(diǎn)
疑難解答