首页 > 编程语言 >c# list-Clone

c# list-Clone

时间:2023-04-11 13:35:32浏览次数:27  
标签:c# list Clone List var new 序列化

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

这篇文章主要给大家介绍了关于C# List引用类型克隆的3种方法,包括反射、序列化(依赖Newtonsoft.Json) 以及序列化(BinaryFormatter)的实现方法,需要的朋友可以参考借鉴,下面来一起看看吧

前言

有时候我们想克隆一个List去做别的事,而不影响原来的List,我们直接在list后面加上小点点,发现并没有Clone这样的扩展函数。这时候就只有自己扩展了。

尝试了三种方式,测试都通过了,至于性能方面我还没有做测试。

下面话不多说了,来一起看看详细的介绍吧

一、反射

public static List<T> Clone<T>(this List<T> list) where T : new()
  {
   List<T> items = new List<T>();
   foreach (var m in list)
   {
    var model = new T();
    var ps = model.GetType().GetProperties();
    var properties = m.GetType().GetProperties();
    foreach (var p in properties)
    {
     foreach (var pm in ps)
     {
      if (pm.Name == p.Name)
      {
       pm.SetValue(model, p.GetValue(m));
      }
     }
    }
    items.Add(model);
   }
   return items;
  }

 

二、序列化(依赖Newtonsoft.Json)

public static List<T> Clone<T>(this List<T> list) where T : new()
{
var str = JsonConvert.SerializeObject(list);
return JsonConvert.DeserializeObject<List<T>>(str);
}

 

三、序列化(BinaryFormatter)

 
public static List<T> Clone<T>(this List<T> list)
  {
   using (Stream objectStream = new MemoryStream())
   {
    IFormatter formatter = new BinaryFormatter();
    formatter.Serialize(objectStream, list);
    objectStream.Seek(0, SeekOrigin.Begin);
    return (List<T>)formatter.Deserialize(objectStream);
   }
  }

 

 

注意事项:

第一种方式无需任何依赖。

第二种方式需要Newtonsoft.Json,如果项目中没有用到它,不推荐使用这种方式。

第三种方式序要给引用类型实体加上[Serializable]特性

标签:c#,list,Clone,List,var,new,序列化
From: https://www.cnblogs.com/Insist-Y/p/17305915.html

相关文章

  • CSS 属性 选择器
     具有特定属性的HTML元素样式具有特定属性的HTML元素样式不仅仅是class和id。注意:IE7和IE8需声明!DOCTYPE才支持属性选择器!IE6和更低的版本不支持属性选择器。属性选择器下面的例子是把包含标题(title)的所有元素变为蓝色:实例[title]{color:blue;}https://www.lekaowang......
  • chatgpt- httppost、get请求示例
    接口数据同步既可以使用POST请求,也可以使用GET请求。一般情况下,使用POST请求更安全,因为POST请求将数据放在请求体中,不会在URL中暴露数据,而GET请求将数据放在URL中,容易被拦截和篡改。以下是使用Java代码实现POST请求和GET请求的示例:使用POST请求同步数据importjava.io.Buffer......
  • docker swarm 删除节点
    有时临时在dockerswarm集群上增加节点(node3),过后需要删除节点#获取node信息dockernodelsIDHOSTNAMESTATUSAVAILABILITYMANAGERSTATUSENGINEVERSIONj52o5frhmphiksqz0xq1mkbbh*node1......
  • 扒一扒Nacos、OpenFeign、Ribbon、loadbalancer组件协调工作的原理
    大家好,我是三友~~前几天有个大兄弟问了我一个问题,注册中心要集成SpringCloud,想实现SpringCloud的负载均衡,需要实现哪些接口和规范。既然这个兄弟问到我了,而我又刚好知道,这不得好好写一篇文章来回答这个问题,虽然在后面的聊天中我已经回答过了。接下来本文就以探究一下Nacos、O......
  • dotnet CLI推送Nuget
    前提:准备好要发布的包选择一个打包工具,可以是dotnetCLI、nuget.exeCLI、MSBuild准备好Nuget官方APIKey自述文件  先必须添加Readme.md到项目中(包含在项目中),双击项目文件,添加README.md(注意路径),并制定文件地址:--javascripttypescriptbashsqljsonhtmlcs......
  • JetBrains AppCode 2023.1 (macOS x64、aarch64) - 适用于 iOS/macOS 开发的智能 IDE
    Xcode14.3compatibility,Swiftrefactoringsandintentions,theIDE’sUI,andKotlinMultiplatformMobile.请访问原文链接:https://sysin.org/blog/jb-appcode-2023/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgJetBrainsAppCode-适用于iOS/macOS开发......
  • 解决javascript调用本地sanic接口报跨域错误的问题
    在py代码中利用middleware()方法修饰request/response即可,无需别的操作。 app=Sanic('Sanic_Server')@app.middleware("request")defcors_middle_req(request:Request):"""路由需要启用OPTIONS方法"""ifrequest.method.lower()==......
  • macOS Big Sur 11.7.6 (20G1231) Boot ISO 原版可引导镜像
    本站下载的macOS软件包,既可以拖拽到Applications(应用程序)下直接安装,也可以制作启动U盘安装,或者在虚拟机中启动安装。另外也支持在Windows和Linux中创建可引导介质。2023年4月10日(北京时间11日凌晨),Apple为那些无法更新macOSVentura的旧Mac发布了macOSBig......
  • Studio 3T 2023.3 (macOS, Linux, Windows) - MongoDB 的专业 GUI、IDE 和 客户端,现在
    TheprofessionalGUI,IDEandclientforMongoDB请访问原文链接:https://sysin.org/blog/studio-3t-2023/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgStudio3T,MongoDB的专业GUI、IDE和客户端适用于MongoDB的所有IDE、客户端和GUI工具——在Atlas......
  • PAT Basic 1082. 射击比赛
    PATBasic1082.射击比赛1.题目描述:本题目给出的射击比赛的规则非常简单,谁打的弹洞距离靶心最近,谁就是冠军;谁差得最远,谁就是菜鸟。本题给出一系列弹洞的平面坐标(x,y),请你编写程序找出冠军和菜鸟。我们假设靶心在原点(0,0)。2.输入格式:输入在第一行中给出一个正整数N(≤10......