如何克隆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()] 。 目标是失去所有参考并建立新的参考。

链接地址: http://www.djcxy.com/p/40785.html

上一篇: How do I clone a generic list in C#?

下一篇: BufferedImage : extract subimage with same data