如何创建包含两个列表的新列表(深度复制而非引用)
创建包含两个列表深度复制元素的新列表
首先要明确:你要的是新列表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
相关产品推荐
相关产品推荐

