You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建包含两个列表的新列表(深度复制而非引用)

创建包含两个列表深度复制元素的新列表

首先要明确:你要的是新列表g包含a和b中所有元素的深度复制版本,而不是把列表a、b本身作为元素加入g(那样只是存引用),也不是浅复制(浅复制只复制引用,元素还是同一个对象)。

要实现深度复制,核心是每个元素都要被完整复制,这依赖元素本身支持深度复制,下面是几种可行的实现方式:

方法一:遍历复制每个元素

如果你的元素类型实现了ICloneable接口,可以直接用Clone()方法;如果没有,需要自己实现通用的深度复制逻辑(比如序列化):

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

List<object> a = new List<object>() { c, d };
List<object> b = new List<object>() { e, f };

List<object> g = new List<object>();

// 复制a的所有元素
foreach (var item in a)
{
    g.Add(DeepClone(item));
}
// 复制b的所有元素
foreach (var item in b)
{
    g.Add(DeepClone(item));
}

// 通用深度复制方法
private static object DeepClone(object obj)
{
    if (obj == null) return null;
    
    // 值类型和字符串直接返回(值类型本身是复制)
    var type = obj.GetType();
    if (type.IsValueType || type == typeof(string))
    {
        return obj;
    }
    
    // 引用类型通过二进制序列化实现深度复制,注意元素类要标记[Serializable]
    using (var ms = new MemoryStream())
    {
        var formatter = new BinaryFormatter();
        formatter.Serialize(ms, obj);
        ms.Position = 0;
        return formatter.Deserialize(ms);
    }
}

方法二:用LINQ简化代码

如果喜欢更简洁的写法,可以用LINQ的Select和Concat组合:

List<object> g = a.Select(DeepClone)
                   .Concat(b.Select(DeepClone))
                   .ToList();

关键注意点

  • 如果你元素的类型有自定义的复制构造函数,也可以在DeepClone里调用构造函数来实现复制,比序列化更高效
  • 所有需要深度复制的引用类型,必须标记[Serializable]才能用二进制序列化的方式(如果用这种方法的话)
  • 不要直接用g.AddRange(a)或者g.AddRange(b),这只是浅复制,新列表里的元素还是和a、b里的元素指向同一个对象

内容的提问来源于stack exchange,提问作者rickster26ter1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 00:53:22