c语言编程笔录

您现在的位置是:首页 > C语言 > C#

C#

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

刘翊惠 2023-08-12C#
引言在C#编程中,List是一种非常常用的集合类型,它可以存储多个对象并提供了方便的操作方法。然而,在某些场景下我们可能需要对List中的对象进行克隆操作。如果List中的对象是引用类型,直接进行复制会导致两个Lis

引言

在C#编程中,List是一种非常常用的集合类型,它可以存储多个对象并提供了方便的操作方法。然而,在某些场景下我们可能需要对List中的对象进行克隆操作。如果List中的对象是引用类型,直接进行复制会导致两个List指向同一块内存地址,这样在修改其中一个List时,另一个List也会受到影响。因此,我们需要用到克隆的方法来实现对List中对象的拷贝操作。

深拷贝与浅拷贝

在介绍克隆方法之前,我们先来了解一下深拷贝和浅拷贝的概念:

浅拷贝是指只复制对象的引用,不复制引用对象本身。这意味着拷贝后的对象和原对象共享相同的引用对象,当其中一个对象修改引用对象时,另一个对象也会受到影响。

深拷贝是指复制对象本身及其引用对象,创建一个全新的对象,即使一个对象修改了引用对象,另一个对象也不会受到影响。

三种List引用类型克隆的方法

以下是三种常用的List引用类型克隆方法:

1. 使用循环逐个对象克隆

List<MyObject> CopyList = new List<MyObject>();
foreach(MyObject obj in OriginalList)
{
    MyObject newObj = new MyObject();
    // 根据需要进行属性值拷贝
    newObj.Property1 = obj.Property1;
    newObj.Property2 = obj.Property2;
    // ...其他属性
    CopyList.Add(newObj);
}

这种方法比较简单直观,通过循环遍历原始List,逐个创建新的对象,将原始对象的属性值拷贝给新对象,并将新对象添加到CopyList中。

2. 使用Linq的Select方法进行克隆

List<MyObject> CopyList = OriginalList.Select(obj => new MyObject()
{
    // 根据需要进行属性值拷贝
    Property1 = obj.Property1,
    Property2 = obj.Property2,
    // ...其他属性
}).ToList();

这种方法利用Linq的Select方法简化了代码,通过Lambda表达式创建新的对象,并且可以在同一行进行属性值的拷贝和赋值操作。

3. 使用序列化和反序列化进行深拷贝

using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

// ...

List<MyObject> CopyList;
using (MemoryStream stream = new MemoryStream())
{
    BinaryFormatter formatter = new BinaryFormatter();
    formatter.Serialize(stream, OriginalList);
    stream.Position = 0;
    CopyList = (List<MyObject>)formatter.Deserialize(stream);
}

这种方法通过将List对象进行序列化和反序列化来进行深拷贝。首先创建一个内存流MemoryStream,然后使用BinaryFormatter将原List对象写入内存流,并将内存流的位置设为0。最后使用BinaryFormatter从内存流中读取对象,进行反序列化得到克隆的List对象。

总结

通过上述三种方法,我们可以实现C#中List引用类型的克隆操作。根据具体需求和场景选择适合的方法,可以灵活应用于不同的项目中。在注意克隆方法的性能和内存占用方面,深拷贝方法可能会比较消耗资源,需要根据实际情况权衡利弊。

文章评论