阵列的DeepCopy

时间:2009-01-05 23:35:12

标签: c# .net

任何人都知道是否有一种简单或已知的方法来编写深度复制方法,它可以在任何类型的数组上工作,即锯齿状,多维等等?我打算把它写成一种扩展方法。

框架中没有默认方法来执行此操作,对吧?我很惊讶没有找到一个。

我已经看到了一些基于序列化的实现,它们很慢,所以我想要一个不使用任何类型的序列化的解决方案。

2 个答案:

答案 0 :(得分:5)

这个问题的现状有点不清楚;它可能一个duplicate(在删除的回复中注明),但评论表明这不太合适。

重新序列化减慢了速度 - 不幸的是,.NET中没有适当支持的“深度克隆”功能。有ICloneable,但这是:很少使用,b:没有说明浅或深。因此,深度克隆数据的唯一剩余可靠方法是使用序列化。

重新“慢下来”,你能量化吗?使用哪种序列化机制? (BinaryFormatterXmlSerializer?)。有关信息,您可能对protobuf-net感兴趣,这是一个非常快速和有效的替代二进制序列化器(并提供了非常方便的T DeepClone<T>(T)方法) - 但是,它只适用于标记为具体方式(例如,它可以使用[DataContract]标记或定制的[ProtoContract]标记。但是,它比内置的序列化器quicker

唯一可行的选择是编写您自己的,每类型的深层复制例程,并可能将其(作为Func<T,T>Converter<T,T>委托)传递给您的扩展方法。

如果您只想要一个副本,事情会更容易,因为您可以使用反射等Here's an option使用已编译的Expression创建浅层副本(.NET 3.5)提高性能。

答案 1 :(得分:-1)

我首先要看一眼:

internal static class Prototype
{
  public static T DeepCopy<T>(this IPrototype<T> target)
  {
    T copy;
    using (var stream = new MemoryStream())
    {
      var formatter = new BinaryFormatter();
      formatter.Serialize(stream, (T)target);
      stream.Seek(0, SeekOrigin.Begin);
      copy = (T) formatter.Deserialize(stream);
      stream.Close();
    }
    return copy;
  }
}

如果这不是你想要的那么快,那么我会优化。