我需要在我正在处理的系统的不同部分克隆列表,我想出了以下解决方案,但我仍然关注它的性能我是一直想知道这是否是一个好方法。所以我决定在这里发布它,以便我可以找到与克隆对象的这种方法有关的任何问题或缺陷。如果这是一个不好的举动,我想知道什么是最好的方法。
我的克隆列表的扩展方法:
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是值类型(始终)
答案 0 :(得分:-1)
这增加了相当大的性能损失和浪费内存(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;
}