对于值类型的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中的对象要实现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来实现序列化与反序列化
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对象的深度拷贝问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
更多浅谈c#中list8742468051c85b06f0a0af9e3e506b5c对象的深度拷贝问题。
