浅谈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环境变量使用与安全管理