c# list集合克隆

这篇具有很好参考价值的文章主要介绍了c# list集合克隆。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在C#中,List集合是一种泛型集合,可以存储任何类型的对象。克隆一个List集合可以通过以下几种方式实现:

  1. 使用List的构造函数

使用List的构造函数可以创建一个新的List对象,并将原始List中的元素复制到新List中。例如:

List<int> list1 = new List<int> { 1, 2, 3 };
                List<int> list2 = new List<int>(list1);

  

在上面的代码中,list2是一个新的List对象,它使用list1中的元素进行初始化。

  1. 使用List的CopyTo方法

List的CopyTo方法可以将原始List中的元素复制到一个数组中,然后再将数组中的元素复制到新的List中。例如

 List<int> list1 = new List<int> { 1, 2, 3 };
                List<int> list2 = new List<int>();
                list1.CopyTo(list2.ToArray());

  

在上面的代码中,list2是一个新的List对象,它使用list1中的元素进行初始化。

  1. 使用序列化

另一种克隆List集合的方法是通过序列化和反序列化。可以将原始List对象序列化为一个字节数组,然后再将字节数组反序列化为新的List对象。例如:

 List<int> list1 = new List<int> { 1, 2, 3 };
                using (MemoryStream stream = new MemoryStream())
                {
                    BinaryFormatter formatter = new BinaryFormatter();
                    formatter.Serialize(stream, list1);
                    stream.Position = 0;
                    List<int> list2 = (List<int>)formatter.Deserialize(stream);
                }

  在上面的代码中,list2是一个新的List对象,它使用list1中的元素进行初始化。这种方法可以用于任何类型的对象,但它需要更多的计算资源和时间。

 

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

# List引用类型克隆的3种方法,包括反射、序列化(依赖Newtonsoft.Json) 以及序列化(BinaryFormatter)的实现方法。

一、反射

/// <summary>
        /// 通过反射方式进行克隆
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="list"></param>
        /// <returns></returns>
        public static List<T> CloneReflect<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)

/// <summary>
        /// 采用第三方序列化方式克隆-依赖Newtonsoft.Json
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="list"></param>
        /// <returns></returns>
        public static List<T> CloneNJson<T>(this List<T> list) where T : new()
        {
            var str = JsonConvert.SerializeObject(list);
            return JsonConvert.DeserializeObject<List<T>>(str);
        }

  三、序列化(BinaryFormatter)

/// <summary>
        /// 通过系统自带系列化克隆
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="list"></param>
        /// <returns></returns>
        public static List<T> CloneBF<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);
            }
        }

  文章来源地址https://www.toymoban.com/news/detail-736559.html

到了这里,关于c# list集合克隆的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【深入浅出C#】章节 5: 高级面向对象编程:泛型编程和集合类型

    高级面向对象编程是在基础面向对象编程的基础上进一步深入和拓展的一种编程范式。它强调封装、继承和多态的概念,并引入了泛型编程和集合类型等高级特性。高级面向对象编程提供了更灵活、可扩展和可复用的代码结构,能够帮助开发者构建更复杂、更高效的应用程序

    2024年02月16日
    浏览(39)
  • 【C# 基础精讲】List 集合的使用

    在C#中, ListT 是一种非常常用的泛型集合类,用于存储一组相同类型的元素。 ListT 具有动态调整大小的能力,可以方便地添加、删除、查找和修改元素,非常灵活和高效。本文将详细介绍 ListT 集合的使用方法,包括创建 ListT 对象、添加元素、删除元素、查找元素、遍历集合

    2024年02月06日
    浏览(23)
  • 【100个 Unity实用技能】☀️ | C#泛型集合常用方法,查找符合要求的第一个元素并返回

    老规矩,先介绍一下 Unity 的科普小知识: Unity 是 实时3D互动内容创作和运营平台 。 包括 游戏开发 、 美术 、 建筑 、 汽车设计 、 影视 在内的所有创作者,借助 Unity 将创意变成现实。 Unity 平台提供一整套完善的软件解决方案,可用于创作、运营和变现任何实时互动的2D和

    2023年04月08日
    浏览(37)
  • c# List集合举例十二种数据处理用法

    Person 类: 请注意,这只是一个简单的示例类,实际场景中可能需要更复杂的属性和方法。 过滤List集合的对象,只保留sex为0的对象,并返回一个新的集合。 找出符合条件的第一个对象,没有返回null。 根据性别对集合进行分组,返回Map集合,每种性别个对应一个集合。 从集

    2024年02月11日
    浏览(28)
  • java基础-集合+泛型+枚举

    说明: 集合框架是一个类库的集合,里面还有很多接口。 里面虚框都是接口 。 全部在java.util HashSet是基于HashMap实现的。 TreeSet是一个有序Set。 ArrayList能快速随机访问,可变大小。 LinkedList随机访问相对慢,但是可以当作stack或者queue来用。 下面是List接口常用的方法: 使用的

    2024年02月20日
    浏览(29)
  • 第五单元 泛型集合

      1、存取数据需要进行装箱拆箱 2、数据类型转换存在隐患   非泛型集合性能   输出结果:非泛型集合耗时(ms):258   泛型集合性能   输出结果:泛型集合耗时(ms):25   使用场景: 在Linq 中比较常见 存储数据   1、T只是占位符,会被传递的数据类型替换。 2、实例化List时传

    2024年02月05日
    浏览(40)
  • 只要背着电脑,他可以去任何地方

    12月是微软全球开发者月,MSDN 微软开发者社区将在此期间推出特别专栏 《技术狂旅》 ,解读这些技术狂热爱好者的个人经历,循着他们的人生旅程看到我们自己的影子,希望能带给你一些启发或激励,一起探寻自身更多的可能性。 作为一名 技术狂热者 ,他有着十足的好奇

    2024年02月04日
    浏览(28)
  • Java笔记(集合、散列表、Map、泛型)

    set:无序不可重复 无序:不保证有序,就是有可能有序,有可能无序 不可重复:不能添加重复数据 HashSet TreeSet:底层是红黑树,会自动排序,意味着里面存储的必须是同类型的元素对象 数字:从小到大排序 字符串:一次比较每一位的ascll码值 日期:自然日期顺序 1.1.TreeS

    2024年02月19日
    浏览(34)
  • 泛型List转List对象(Json转换工具类)

    上期讲解了 Java多线程查表(封装方法 多表通用) https://blog.csdn.net/weixin_56567361/article/details/128021905 因为是通用方法 返回的结果值为泛型ListT类型 在使用list时 需要转换为list对象 下面我将对比三种转换方法: 1 阿里巴巴fastJson方法  2 JAVA反射方式转换 3 强转方式 直接上测试图

    2024年02月15日
    浏览(26)
  • 泛型——List 优于数组

    数组与泛型有很大的不同: 1. 数组是协变的(covariant) 意思是:如果Sub是Super的子类型,则数组类型Sub[] 是数组类型Super[] 的子类型。 2. 泛型是不变的(invariant) 对于任何两种不同的类型Type1 和Type2,ListType1 既不是ListType2 的子类型也不是父类型。 现在有两段代码: 无论哪

    2024年02月02日
    浏览(22)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包