【发布时间】:2010-10-05 21:20:59
【问题描述】:
我认为克隆一个 List 你只需调用:
List<int> cloneList = new List<int>(originalList);
但我在我的代码中尝试过,我似乎得到了暗示上述内容只是在做的效果:
cloneList = originalList... 因为对 cloneList 的更改似乎正在影响 originalList。
那么克隆 List 的方法是什么?
编辑:
我正在考虑做这样的事情:
public static List<T> Clone<T>(this List<T> originalList) where T : ICloneable
{
return originalList.ConvertAll(x => (T) x.Clone());
}
编辑2:
我采用了 Binoj Antony 建议的深拷贝代码并创建了这个扩展方法:
public static T DeepCopy<T>(this T original) where T : class
{
using (MemoryStream memoryStream = new MemoryStream())
{
BinaryFormatter binaryFormatter = new BinaryFormatter();
binaryFormatter.Serialize(memoryStream, original);
memoryStream.Seek(0, SeekOrigin.Begin);
return (T)binaryFormatter.Deserialize(memoryStream);
}
}
EDIT3:
现在,假设 List 中的项目是结构。如果我打电话会有什么结果?:
List<StructType> cloneList = new List<StructType>(originalList);
我很确定我会得到一个包含新的独特项目的列表,对吗?
【问题讨论】:
-
还重新编辑 - 请注意 ICloneable 是 a:支持不佳,b:指定不佳(深与浅) - 结果在日常使用中并不常见。
-
重新编辑 - originalList.ConvertAll(item => (T)item.Clone()) 会更有效 - 它可以正确设置大小而无需重新分配列表以适应。
-
感谢这两点,他们已经注意到了
-
您应该真正将其视为一个系统并以通用方式实现 ICloneable。您可以为实现 ICloneable 的对象创建扩展方法并以这种方式克隆它们。如果不存在这样的方法回退到对象序列化,但我真的建议不要这样做。
-
你最后用的是哪一个?