Подпрограмма глубокого копирования C#

Может ли кто-нибудь помочь мне написать процедуру DeepCopy для этого матричного класса, который у меня есть? У меня нет большого опыта в C#.

public class Matrix<T>
{
    private readonly T[][] _matrix;
    private readonly int row;
    private readonly int col;

    public Matrix(int x, int y)
    {
        _matrix = new T[x][];
        row = x;
        col = y;
        for (int r = 0; r < x; r++)
        {
            _matrix[r] = new T[y];
        }
    }
}

заранее спасибо


person nixgadget    schedule 13.10.2011    source источник
comment
Это должно помочь stackoverflow.com/questions/6052756/c- потокобезопасное глубокое копирование   -  person Security Hound    schedule 13.10.2011


Ответы (1)


Простейшим способом глубокого копирования будет использование какого-либо сериализатора (например, BinaryFormatter), но для этого требуется, чтобы не только ваш тип был оформлен как Serializable, но и тип T.

Примером реализации этого может быть:

[Serializable]
public class Matrix<T>
{
  // ...
}

public static class Helper
{
  public static T DeepCopy<T>(T obj)
  {
    using (var stream = new MemoryStream())
    {
      var formatter = new BinaryFormatter();
      formatter.Serialize(stream, obj);
      stream.Position = 0;
      return (T) formatter.Deserialize(stream);
    }
  }
}

Проблема здесь в том, что вы не можете контролировать, какой тип предоставляется в качестве параметра универсального типа. Не зная больше о том, какие типы вы хотите клонировать, можно было бы наложить ограничение общего типа на T, чтобы принимать только типы, которые реализуют ICloneable.

В этом случае вы можете клонировать Matrix<T> следующим образом:

public class Matrix<T> where T: ICloneable
{
  // ... fields and ctor

  public Matrix<T> DeepCopy()
  {
    var cloned = new Matrix<T>(row, col);
    for (int x = 0; x < row; x++) {
      for (int y = 0; y < col; y++) {
        cloned._matrix[x][y] = (T)_matrix[x][y].Clone();
      }
    }
    return cloned;
  }
}
person Yannick Motton    schedule 13.10.2011
comment
Потрясающие. только то, что я после. ты легенда! - person nixgadget; 13.10.2011