C# List 复制之深浅拷贝

news/2024/5/20 0:28:44 标签: c#, list, .netcore

C# List 复制 之深浅拷贝

声明类

        public class TestStu
        {
            public int Number
            {
                get;set;    
            }

            public string Name
            {
                get;set;    
            }
        }
        
 		public static async Task<int> Main(string[] args)
        {
            var stu1 = new TestStu()
            {
                Number = 1,
                Name = "1"
            };

            var stu2= new TestStu()
            {
                Number = 2,
                Name = "2"
            };

            var list1 = new List<TestStu> { stu1, stu2};
            
			var list2 = new List<TestStu>();
            list1.ForEach(list2.Add);
            
            var list3 = new List<TestStu>();
            foreach (var item in list)
            {
                list3.Add(new TestStu()
                {
                    Number = item.Number,
                    Name = item.Name
                });
            }
			
			var list4 = DeepCopy(list3);
			
            list1.FirstOrDefault().Name = "3";
            list1.FirstOrDefault().Number = 3;

执行上述方法, 修改list1 中的属性值, 发现list2 的属性值会跟着变化, list3 的属性值不发生变化;

由于进行的是浅拷贝,所以直接将list1的内容复制给了list2,虽然list1和list2所在的地址不一样,但是两个list存储的对象仍然是相同的(因为把list1复制到list2时,浅拷贝复制的是引用地址),导致改变在list1中改变属性时,list2中的属性也会改变;

若想保留一份list1 的原始副本数据, 可以用list3 创建赋值的方式, 但是繁琐, 可以使用深拷贝的方式;
深拷贝方法如下:

		//深拷贝方法
        public static List<T> DeepCopy<T>(this List<T> list)
        {
            var options = new JsonSerializerOptions
            {
                IgnoreReadOnlyProperties = true,
                IncludeFields = true
            };
            var serialized = JsonSerializer.Serialize(list, options);
            return JsonSerializer.Deserialize<List<T>>(serialized, options);
        }
//修改list1 的属性, list4 的属性不会发生变化
var list4 = DeepCopy(list3);

http://www.niftyadmin.cn/n/5054721.html

相关文章

HTTP 跨域名请求(CORS)

同源策略 出于安全考虑&#xff0c;浏览器会限制脚本中发起的跨域请求。比如&#xff0c;使用 XMLHttpRequest 对象和Fetch发起 HTTP 请求就必须遵守同源策略。 具体而言&#xff0c;Web 应用程序通过 XMLHttpRequest 对象或Fetch能且只能向同域名的资源发起 HTTP 请求&#x…

MySQL 开启配置binlog以及通过binlog恢复数据

目录 一、binlog日志基本概念二、开启binlog日志记录2.1、查看binlog日志记录启用状态2.2、开启配置binlog日志 三、制作测试数据&#xff08;可以先不执行&#xff0c;这里是为后续数据恢复做准备&#xff0c;先看数据恢复流程&#xff09;四、使用binlog日志恢复数据4.1、前置…

【信创】麒麟v10(arm)-mysql8-mongo-redis-oceanbase

Win10/Win11 借助qume模拟器安装arm64麒麟v10 前言 近两年的国产化进程一直在推进&#xff0c;基于arm架构的国产系统也在积极发展&#xff0c;这里记录一下基于麒麟v10arm版安装常见数据库的方案。 麒麟软件介绍: 银河麒麟高级服务器操作系统V10 - 国产操作系统、银河麒麟、中…

动态规划:回文串问题(C++)

动态规划&#xff1a;回文串问题 前言回文串问题1.回文子串&#xff08;中等&#xff09;2.回文串分割IV&#xff08;困难&#xff09;3.分割回文串II&#xff08;困难&#xff09;4.最长回文子序列&#xff08;中等&#xff09;5.让字符串成为回文串的最小插入次数&#xff08…

kubectl系列(三)-节点标签操作

pod可以根据要求让pod调度到想要的节点上运行&#xff0c;或者不在某节点运行。 1 查看现有节点运行环境已有标签 kubectl get nodes --show-labels 2 添加标签 #给节点node1打上标签envuat kubectl label node node1 envuat#给节点node2打上标签envprod kubectl label nod…

centos 离线环境安装docker

1.下载docker https://download.docker.com/linux/static/stable/x86_64/docker-23.0.1.tgz其他版本在上级目录选择下载https://download.docker.com/linux/static/stable/x86_64/ 2.下载的文件上传到centos服务器上并解压 tar -zxvf docker-23.0.1.tgz3.复制解压目录中的文件…

开启赏车新体验 远航汽车即将亮相2023中国(天津)国际汽车展览会

2023年9月28日至10月4日&#xff0c;2023中国&#xff08;天津&#xff09;国际汽车展览会将在国家会展中心&#xff08;天津&#xff09;举行。本次车展预计展出总面积20万平方米&#xff0c;是本年度北方地区规模最大、品牌最齐全的国际顶级车展。远航汽车将携旗下多款车型亮…

Tomcat多实例+Nginx动静分离、负载均衡

这里写目录标题 Tomcat多实例动静分离、负载均衡一、Tomcat多实例部署1、安装JDK2、安装启动tomcat 二、NginxTomcat负载均衡、动静分离1、Nginx负载均衡实现原理1.1 原理1.2 Nginx配置反向代理的主要参数 2、Nginx动静分离实现原理2.1 原理2.2 Nginx静态处理优势 3、动静分离配…