如何在C#中深度复制矩阵?

时间:2011-11-22 15:30:33

标签: c# performance data-structures deep-copy

我收到List<List<CustomClass>>,其中CustomClass是参考类型。

我需要将这个矩阵的完整深层复制到一个新矩阵中。由于我需要深层复制,因此矩阵中的每个CustomClass对象都必须复制到新矩阵中。

你会如何以有效的方式做到这一点?

4 个答案:

答案 0 :(得分:4)

对于实现ICloneable的CustomClass,这不是很困难:

var myList = new List<List<CustomClass>>();

//populate myList

var clonedList = new List<List<CustomClass>>();

//here's the beef
foreach(var sublist in myList)
{
   var newSubList = new List<CustomClass>();
   clonedList.Add(newSubList);
   foreach(var item in sublist)
      newSublist.Add((CustomClass)(item.Clone()));
}

如果你觉得你不想实现ICloneable,你可以用任何“DeepCopy”类型的方法以类似的方式工作(我建议使用内置接口)。

答案 1 :(得分:3)

一种更简单的方法序列化整个对象,然后反序列化再次尝试此扩展方法:

public static T DeepClone<T>(this T source)
{
  if (!typeof(T).IsSerializable)
  {
    throw new ArgumentException("The type must be serializable.", "source");
  }

  // Don't serialize a null object, simply return the default for that object
  if (Object.ReferenceEquals(source, null))
  {
    return default(T);
  }

  IFormatter formatter = new BinaryFormatter();
  Stream stream = new MemoryStream();
  using (stream)
  {
    formatter.Serialize(stream, source);
    stream.Seek(0, SeekOrigin.Begin);
    return (T)formatter.Deserialize(stream);
  }
}

<强> USAGE

List<List<CustomClass>> foobar = GetListOfListOfCustomClass();

List<List<CustomClass>> deepClonedObject = foobar.DeepClone();

答案 2 :(得分:1)

有两种可能性:

  1. 在CustomClass上实现ICloneable接口,然后您可以克隆对象。

  2. 如果可以序列化类,则将其序列化为内存流并从那里反序列化。这将创建它的副本。

  3. 我更愿意采用第一种方法,因为我认为序列化/反序列化比通过ICloneable进行克隆要慢。

答案 3 :(得分:1)

假设您有Copy方法可以复制CustomClass个对象:

var newMatrix = oldMatrix
    .Select(subList => subList.Select(custom => Copy(custom)).ToList())
    .ToList();