我需要在我正在处理的系统的不同部分克隆列表,我想出了以下解决方案,但我仍然担心它的性能我一直在想这是否是一个好方法.所以我决定在这里发布它,以便我可以找到与这种克隆对象方法相关的问题或缺陷。如果这是一个糟糕的举动,我想知道什么是最好的方法。
我的克隆列表的扩展方法:
public static List<T> Clone<T>(this List<T> input)
{
using (System.IO.MemoryStream Mems = new System.IO.MemoryStream())
{
XmlSerializer Serializer = new XmlSerializer(typeof(T));
Serializer.Serialize(Mems, input);
var Deserialized = Serializer.Deserialize(Mems) as List<T>;
return Deserialized;
}
}
更新:假设 T 是一个值类型(总是)
这增加了相当大的性能损失并浪费了内存(XML 很冗长)。
浅克隆:
public static List<T> Clone<T>(this List<T> input)
{
return new List<T>(input);
}
深度克隆:
public static List<T> Clone<T>(this List<T> input) where T : ICloneable
{
var cloned = new List<T>(input.Capacity);
cloned.AddRange(input.Select(item => (T) item.Clone()));
return cloned;
}
我是一名优秀的程序员,十分优秀!