在C#中,实现集合的深拷贝(deep copy)涉及创建一个新的集合,并递归地复制原始集合中的所有元素及其嵌套的对象。深拷贝与浅拷贝(shallow copy)的区别在于,深拷贝不仅复制对象的引用,还复制对象本身及其包含的所有子对象。
以下是一些常见集合类型(如List、Dictionary等)的深拷贝实现方法:
1. 使用序列化/反序列化
一种简单且通用的方法是使用序列化(Serialization)和反序列化(Deserialization)。这种方法适用于许多不同类型的对象,包括集合。
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
[Serializable]
public class MyComplexObject
{
public int Id { get; set; }
public string Name { get; set; }
// 其他属性
}
public static class DeepCopier
{
public static T DeepCopy<T>(T obj)
{
using (var ms = new MemoryStream())
{
IFormatter formatter = new BinaryFormatter();
formatter.Serialize(ms, obj);
ms.Seek(0, SeekOrigin.Begin);
return (T)formatter.Deserialize(ms);
}
}
}
class Program
{
static void Main()
{
var originalList = new List<MyComplexObject>
{
new MyComplexObject { Id = 1, Name = "Object1" },
new MyComplexObject { Id = 2, Name = "Object2" }
};
var copiedList = DeepCopier.DeepCopy(originalList);
// 修改副本不会影响原始列表
copiedList[0].Name = "ModifiedCopy";
Console.WriteLine(originalList[0].Name); // 输出: Object1
}
}
2. 手动实现深拷贝
对于简单的集合,可以手动实现深拷贝。这通常涉及递归地复制集合中的每个对象。
using System;
using System.Collections.Generic;
using System.Linq;
public class MyComplexObject
{
public int Id { get; set; }
public string Name { get; set; }
// 假设有一个拷贝构造函数
public MyComplexObject(MyComplexObject other)
{
Id = other.Id;
Name = other.Name;
// 如果有其他复杂属性,也需要拷贝
}
}
public static class DeepCopier
{
public static List<T> DeepCopyList<T>(List<T> list) where T : new()
{
if (list == null) return null;
var newList = new List<T>();
foreach (var item in list)
{
if (item is MyComplexObject complexItem)
{
newList.Add(new MyComplexObject(complexItem)); // 使用拷贝构造函数
}
else if (item is IEnumerable<T> enumerableItem)
{
newList.Add((T)DeepCopyList((List<T>)enumerableItem)); // 递归拷贝
}
else
{
newList.Add((T)item.MemberwiseClone()); // 值类型直接浅拷贝
}
}
return newList;
}
}
class Program
{
static void Main()
{
var originalList = new List<MyComplexObject>
{
new MyComplexObject { Id = 1, Name = "Object1" },
new MyComplexObject { Id = 2, Name = "Object2" }
};
var copiedList = DeepCopier.DeepCopyList(originalList);
// 修改副本不会影响原始列表
copiedList[0].Name = "ModifiedCopy";
Console.WriteLine(originalList[0].Name); // 输出: Object1
}
}
3. 使用第三方库
还有一些第三方库(如AutoMapper、ValueInjecter等)可以帮助实现深拷贝。这些库通常提供了更灵活和强大的映射功能。
例如,使用AutoMapper:
using AutoMapper;
public class MyComplexObjectProfile : Profile
{
public MyComplexObjectProfile()
{
CreateMap<MyComplexObject, MyComplexObject>();
}
}
class Program
{
static void Main()
{
var config = new MapperConfiguration(cfg => cfg.AddProfile<MyComplexObjectProfile>());
var mapper = config.CreateMapper();
var originalList = new List<MyComplexObject>
{
new MyComplexObject { Id = 1, Name = "Object1" },
new MyComplexObject { Id = 2, Name = "Object2" }
};
var copiedList = mapper.Map<List<MyComplexObject>>(originalList);
// 修改副本不会影响原始列表
copiedList[0].Name = "ModifiedCopy";
Console.WriteLine(originalList[0].Name); // 输出: Object1
}
}
注意:AutoMapper主要用于对象到对象的映射,对于集合的深拷贝,需要额外配置。
序列化方法简单通用,但性能可能较低;手动实现方法灵活,但需要更多的代码;第三方库提供了灵活性和易用性,但需要额外的依赖。
标签:Name,C#,MyComplexObject,var,集合,new,拷贝,public From: https://blog.csdn.net/x1234w4321/article/details/144063953