C#中List<T>对象的深度拷贝问题

用于复制或克隆列表的C#程序 复制列表可以创建一个新的列表,其元素与原始列表相同,但是在内存中具有不同的引用。为了验证克隆列表的独立性,我们修改原始列表的第一个元素,并再次输出两个列表的内容。从输出结果可以看出,修改原始列表后,克隆列表并没有受到影响,它仍保持着复制时的原始值。首先,我们将创建一个名为ListCloner的C#类,该类将包含一个用于复制列表的静态方法。该方法接受一个泛型列表作为参数,并返回一个新的克隆列表。类,您可以在C#中轻松地复制或克隆列表,以确保在处理列表数据时不会对原始列表产生意外的副作用。,其中包含一些整数。 阅读详情

一、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 克隆副本 - 创建列表的副本 无论是使用构造函数还是 Clone 方法,都可以轻松地克隆一个 List 对象,以便在不修改原始列表的情况下进行操作。在 C# 编程中,有时我们需要创建一个现有列表的副本,以便在不修改原始列表的情况下进行操作。要克隆一个 List 对象,我们可以使用 List 类的构造函数或 List 类的 Clone 方法。从输出中可以看出,原始列表和两个副本列表的元素是相同的,但它们是独立的 List 对象。这将创建一个新的 List 对象,并将原始列表的元素复制到新列表中。的辅助方法,用于打印列表的元素。 阅读详情

相关推荐

C#中List的复制操作是一项常见而重要的任务。在本文中,我们将探讨如何使用C#编写代码来实现List的复制,并通过提供源代码和相应的描述来详细介绍这个过程。

上述代码中,我们首先创建了一个名为sourceList的List对象,并初始化了一些整数值。在本文中,我们将探讨如何使用C#编写代码来实现List的复制,并通过提供源代码和相应的描述来详细介绍这个过程。然而,如果List包含大量元素,这种方法可能会变得效率较低,因为循环遍历需要花费较长的时间。该方法将创建并返回一个新的List对象,其中包含与源列表相同的元素。综上所述,我们介绍了在C#中复制List的两种常见方法。在C#中,可以使用许多不同的方法来复制一个List对象。下面我们将讨论其中两种常见的方法。

学习使你进步。 927

C# List的克隆

克隆方法 /// <summary> /// Clones the specified list. /// </summary> /// <typeparam name="T"></typeparam> /// <param name="List">The...

诚的博客 3477

C# List引用类型克隆的3种方法

前言 有时候我们想克隆一个List去做别的事,而不影响原来的List,我们直接在list后面加上小点点,发现并没有Clone这样的扩展函数。这时候就只有自己扩展了。 尝试了三种方式,测试都通过了,至于性能方面我还没有做测试。 下面话不多说了,来一起看看详细的介绍吧 一、反射 public static List Clone(this List list) where T : new() { List items = new List(); foreach (var m in list) { var model = new T();

C#中List<T>对象的深度拷贝问题 (Clone)

一、List对象中的T是值类型的情况(int 类型等) 对于值类型的List直接用以下方法就可以复制: List oldList =new List();  oldList.Add(..);   List newList =new List(oldList);   List oldList = new List(); oldList.Add(..); List newLi

sun307146966的专栏 4862

第二次 PX4仿真环境搭建过程全记录

参考链接 https://blog.youkuaiyun.com/yanwumuxi/article/details/80097294 https://www.ncnynl.com/archives/201709/2013.html 一、安装依赖项 我们使用Debian / Ubuntu LTS 作为Linux的标准支持版本,但是也支持Cent OS 和 Arch Linux的发行版本。 权限设置 警告:永远...

移步换景的博客 2260

VisionPro开发实战:CogRecordDisplay控件显示与保存图片的完整流程(附C#代码示例)

本文详细解析了VisionPro开发中CogRecordDisplay控件的图像处理全流程,包括图像加载、显示优化、动态清屏及结果保存等关键操作。通过C#代码示例,展示了如何高效使用该控件进行工业视觉应用开发,特别适合自动化检测系统的开发者参考。

weixin_42523792的博客 274

android list深度复制,浅谈C#中List<T>对象的深度拷贝问题

浅谈C#中List对象的深度拷贝问题发布时间:2020-08-25 02:44:58来源:脚本之家阅读:157作者:jingxian一、List对象中的T是值类型的情况(int 类型等)对于值类型的List直接用以下方法就可以复制:List oldList = new List();oldList.Add(..);List newList = new List(oldList);二、List对象中...

weixin_39946534的博客 493

Mixer-First Receiver适用于宽带阵列应用的接收机技术1

Mixer-First Receiver适用于宽带阵列应用的接收机技术1技术的背景单元级数字化阵列传统链路到Mixer-First链路的逻辑考虑三种场景小结 技术的背景 在文章《吊打全球的顶级毫米波数字阵列项目-MIDAS》中提到了DARPA在MIDAS项目中在毫米波实现宽带单元级数字化阵列用到了一个关键的叫做N-Path filter的技术,而这个技术同样出现在了《让微波射频工程师颤抖的芯片-MATRICs》的MATRICs芯片中。 为什么DARPA的各个合作研究机构选择这种技术?这篇来自Universi

ICONO的博客 2166

C# 对象深度拷贝

/// <summary> /// 对象拷贝 /// </summary> /// <param name="obj">被复制对象</param> /// <returns>新对象</returns> private object ...

yingying0708的专栏 2291

基于Ventoy制作单个U盘引导Windows+Linux+黑苹果macOS

一款国内高手开发的一个名为Ventoy的开源多系统启动U盘制作工具,官方链接:https://www.ventoy.net/cn/index.html Ventoy 特点 不影响U盘日常普通使用 直接从ISO文件启动,无需解开 支持MBR和GPT分区格式(1.0.15+) 支持超过4GB的ISO文件 支持大部分常见操作系统, 已测试650+ 个ISO文件 不仅仅是启动,而是完整的安装过程 版本升级时数据不会丢失 Ventoy 待改进 不支持macOS和ChromeOS 准备2个空的U.

wybarcelona的博客 3万+

基于STM32设计的遥控灭火消防小车_296

随着城市化进程的加速和火灾发生频率的增加,传统的消防方式在应对初期火灾时存在反应慢、效率低等问题。为了提高火灾响应速度和灭火效率,本设计开发了一款基于STM32单片机的遥控灭火消防小车。该小车配备了烟雾检测、温湿度监测、火源定位、灭火操作等功能,能够通过蓝牙和WIFI实现远程控制与实时视频传输。设计采用了MQ2烟雾传感器、SHT30温湿度传感器、火光传感器和ESP32摄像头模块等硬件设备。系统不仅能够自动检测和定位火源,还可以手动调整灭火器对准位置,进行干粉灭火。此外,蜂鸣器用于火源报警,确保操作人员及时得

720

C#实现对象的深度复制,可以用于解决文件被占用的问题

C#实现对象的深度复制,可以用于解决文件被占用的问题 勇哥注: 在解决“文件被占用”的问题时,有时候除了即时释放资源句柄,还需要使用对象的深度复制,这样就相当于斩断了原对象的占用。 ==========正文开始=================== C# MemberwiseClone 方法创建一个浅表副本,具体来说就是创建一个新对象, 然后将当前对象的非静态字段复制到该新对象。 如果字段是值类型的,则对该字段执行逐位复制。如果字段是引用类型, 则复制引用但不复制引用的对象;因此,原始对象.

u014090257的博客 1679

Qt应用软件【协议篇】自定义协议处理串口半包贴包

Qt串口数据,半包,贴包,丢包数据处理

小鱼酱的博客 1206

c#中实现拷贝对象的案例

能不能有更优雅的解决方案。很多人一定很奇怪,之所以会出现这样的问题,就和值类型和引用类型有关,第一个值函数的 string 本身是个值类型,他在存储的时候,是直接开辟了一个存储空间,而第二个data类型的在存储的时候,其实是通过指针将变量和其存储空间链接在了一起,当声明data b=a时,就将b的指针指向了a的指针所指向的存储位置,而当将b.key=“2"赋值后,其实是将b.key所指向的存储空间赋值"2”,这个时候因为a和b的指针是指向同一个存储空间的,所以a.key和b.key的值同时变成了2。

weixin_41883890的博客 2917

AMBA-CHI协议详解(十五)

Write transactions事务描述以及请求属性,cache line状态转换。

Crazzy_M的博客 648

AFSim2.9.0学习笔记 —— 1、AFSim及完整工具介绍(文末附:完整afsim2.9.0源码、编译好的完整工具包、中文教材等)

AFSim2.9.0学习笔记 —— 1、AFSim及完整工具介绍(附:完整afsim2.9.0源码、编译好的完整工具包、中文教材等)

5165

C# 实现Dictionary数据对象的深度拷贝

最近由于在做聊天调度服务,场景是这样的,集群聊天服务器,每台服务通过socket按照一定的频率发送UDP数据包给调度服务器,调度服务器接收各台聊天服务器发来的数据包,然后进行相应的数据分析,最后裁定目前最空闲的聊天服务器,以供聊天用户实时快速连接最优服务器,我考虑使用Dictionary数据结构来缓存收集到的服务器汇总数据,开发的过程中遇到几个比较棘手的问题: 1、收集的数据是通过多线程进行的,...

weixin_30892763的博客 2188

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

C# 急速深度拷贝

怎样深度拷贝最快呢? 假设有这样的俩个对象 public class People { public int Age { get; set; } public string Name { get; set; } public string Sex { get; set; } } public class Ma...

隔壁王叔叔 1498

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

C#实现深度拷贝的几种实现方法

实现深度拷贝的几种方式

lel18570471704的博客 4064

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

上一篇: 五大常用算法之二:动态规划算法
下一篇: 面向对象设计原则
XJAVASunjava
博客等级 码龄18年 36粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值