如何克隆C#中的通用列表?
我有一个C#中的对象的通用列表,并希望克隆列表。 列表中的项目是可复制的,但似乎没有做list.Clone()
的选项。
有没有简单的方法呢?
您可以使用扩展方法。
static class Extensions
{
public static IList<T> Clone<T>(this IList<T> listToClone) where T: ICloneable
{
return listToClone.Select(item => (T)item.Clone()).ToList();
}
}
如果你的元素是值类型,那么你可以这样做:
List<YourType> newList = new List<YourType>(oldList);
但是,如果它们是引用类型,并且您想要深度复制(假设您的元素正确实现了ICloneable
),则可以执行如下操作:
List<ICloneable> oldList = new List<ICloneable>();
List<ICloneable> newList = new List<ICloneable>(oldList.Count);
oldList.ForEach((item) =>
{
newList.Add((ICloneable)item.Clone());
});
显然,在上面的泛型中替换ICloneable
,并且使用实现ICloneable
元素类型进行ICloneable
。
如果您的元素类型不支持ICloneable
但确实有复制构造函数,则可以这样做:
List<YourType> oldList = new List<YourType>();
List<YourType> newList = new List<YourType>(oldList.Count);
oldList.ForEach((item)=>
{
newList.Add(new YourType(item));
});
就个人而言,我会避免ICloneable
因为需要保证所有成员的深层副本。 相反,我建议拷贝构造函数或工厂方法一样YourType.CopyFrom(YourType itemToCopy)
返回的新实例YourType
。
这些选项中的任何一个都可以用方法(扩展或其他方法)包装。
public static object DeepClone(object obj)
{
object objResult = null;
using (MemoryStream ms = new MemoryStream())
{
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(ms, obj);
ms.Position = 0;
objResult = bf.Deserialize(ms);
}
return objResult;
}
这是用C#和.NET 2.0来完成的一种方法。 你的对象需要[Serializable()]
。 目标是失去所有参考并建立新的参考。