浅谈C#中List<T>对象的深度拷贝问题
发布时间 - 2026-01-10 22:36:55 点击率:次一、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中的对象要实现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
# 对象深度拷贝
# C# 泛型集合类List<T>使用总结
# C# 如何实现一个带通知的List<T>
# 关于C#泛型列表List<T>的基本用法总结
# C# List<T>的用法小结
# C#中List<T>存放元素的工作机制
# 给大家
# 序列化
# 化与
# 象中
# 可以用
# 只会
# 希望能
# 几种
# 自定义
# 这篇
# 浅谈
# 来实现
# 此种
# 小编
# 大家多多
# 就可以
# 进行测试
# 最可靠
# 实体类
# item
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何处理表单验证?(Requests代码示例)
Laravel如何使用withoutEvents方法临时禁用模型事件
Python进程池调度策略_任务分发说明【指导】
文字头像制作网站推荐软件,醒图能自动配文字吗?
html如何与html链接_实现多个HTML页面互相链接【互相】
JavaScript如何实现路由_前端路由原理是什么
Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南
ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】
Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】
Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】
Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤
网站优化排名时,需要考虑哪些问题呢?
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
详解Oracle修改字段类型方法总结
南京网站制作费用,南京远驱官方网站?
Laravel如何与Pusher实现实时通信?(WebSocket示例)
Android中AutoCompleteTextView自动提示
Linux系统命令中screen命令详解
laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法
七夕网站制作视频,七夕大促活动怎么报名?
浅述节点的创建及常见功能的实现
Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)
如何确保FTP站点访问权限与数据传输安全?
Linux系统运维自动化项目教程_Ansible批量管理实战
如何快速上传自定义模板至建站之星?
html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】
详解阿里云nginx服务器多站点的配置
Laravel观察者模式如何使用_Laravel Model Observer配置
音响网站制作视频教程,隆霸音响官方网站?
Android自定义listview布局实现上拉加载下拉刷新功能
零基础网站服务器架设实战:轻量应用与域名解析配置指南
Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】
JS中对数组元素进行增删改移的方法总结
如何快速搭建二级域名独立网站?
Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)
html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】
Python3.6正式版新特性预览
Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境
Laravel集合Collection怎么用_Laravel集合常用函数详解
Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】
黑客如何通过漏洞一步步攻陷网站服务器?
百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧
如何在阿里云香港服务器快速搭建网站?
如何用PHP工具快速搭建高效网站?
如何快速搭建个人网站并优化SEO?
米侠浏览器网页背景异常怎么办 米侠显示修复
电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?
非常酷的网站设计制作软件,酷培ai教育官方网站?
PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑
Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理

