【C#】List<T>对象的深复制
2023-09-11 14:22:26 时间
一、List对象中的T是值类型的情况(int 类型等)
对于值类型的List直接用以下方法就可以复制:
List<T> oldList = new List<T>(); oldList.Add(..); List<T> newList = new List<T>(oldList);
二、List对象中的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(); } //<span style="color:#000000;">当然前题是List中的对象要实现ICloneable接口</span> }
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"; } } }
四、其他方式
T如果是引用类型的,采用如下方式初始化列表:
ObservableCollection<T> tempList = new ObservableCollection<T>(sourceList);
sourceList.Clear(); // 清除源数据列表
System.Console.WriteLine(tempList.Count); // 副本数据并未改变
相关文章
- c# 中内部类的简单介绍 C#内部类
- JavaScript日历控件开发 C# 读取 appconfig文件配置数据库连接字符串,和配置文件 List<T>.ForEach 调用异步方法的意外 ef 增加或者更新的习惯思维 asp.net core导入excel 一个二级联动
- 史上最全的CSS hack方式一览 jQuery 图片轮播的代码分离 JQuery中的动画 C#中Trim()、TrimStart()、TrimEnd()的用法 marquee 标签的使用详情 js鼠标事件 js添加遮罩层 页面上通过地址栏传值时出现乱码的两种解决方法 ref和out的区别在c#中 总结
- wpf 导出Excel Wpf Button 样式 wpf简单进度条 List泛型集合对象排序 C#集合
- 浅谈JS中的!=、== 、!==、===的用法和区别 JS中Null与Undefined的区别 读取XML文件 获取路径的方式 C#中Cookie,Session,Application的用法与区别? c#反射 抽象工厂
- C#学习记录——循环
- 【C#】扩展方法(方法参数里的this)
- List分割:等分成n个list;指定元素个数n等分
- C#【规范篇】命名规范(控件)
- C#,递归方法实现双向链表(Doubly Linked List)的反转(Reverse)算法与源代码
- C#中List<T>是怎么存放元素的
- C#-获取datatable指定列的数据
- 《圣殿祭司的ASP.NET4.0专家技术手册》----2-6 C# 3.0语言功能
- C# List 去重
- C#中DataTable转换List和List再转为DataTable,以及DataRow转为实体对象
- 【C#】C#中常用字符串转16进制
- C# List和SortedList简介
- [C#]LINQ中如何按实体的某个属性去重 DistinctBy
- 【C#】访问泛型中的List列表数据
- c#类的定义,c#中的关健字,C#标识符