簡體   English   中英

C#克隆泛型

[英]C# Clone Generic

我有一個Matrix類,並嘗試在此類中重載+運算符。 問題出在matrix1matrix2 ,我無法為此對象創建一個副本。 我什至已經嘗試過使用一些for循環來實現它for但是它拋出了OutOfMemoryException

    public static Matrix<T> operator +(Matrix<T> matrix1, Matrix<T> matrix2)
    {
        Matrix<T> m1 = matrix1;
        Matrix<T> m2 = matrix2;
        Matrix<T> result = new Matrix<T>();

        if (m1.Cols != m2.Cols || m1.Rows != m2.Rows)
        {
            if (m1.Rows > m2.Rows)
                m2.Rows = m1.Rows;
            else if (m1.Rows < m2.Rows)
                m1.Rows = m2.Rows;
            if (m1.Cols > m2.Cols)
                m2.Cols = m1.Cols;
            else if (m1.Cols < m2.Cols)
                m1.Cols = m2.Cols;
        }

        for (int i = 0; i < m1.Rows; i++)
        {
            result.Add(new List<T>());

            for (int j = 0; j < m1.Cols; j++)
            {
                result[i].Add(new T());
                result[i][j] = Sum<T>(m1[i, j], m2[i, j]);
            }
        }

        result.Cols = m1.Cols;
        return result;
    }

我是這樣做的

    public static List<List<T>> ListClone(List<List<T>> data)
    {  
        var new_data= new List<List<T>>();

        foreach (var list in data)
        {
            new_data.Add(ListClone(list)); 
        }

        return new_data;
    }

    public static List<T> ListClone(List<T> list)
    {
        var new_list = new List<T>();

        foreach(var i in list)
        {
            new_list.Add((T)i);
        }

        return new_list;
    }

    public static Matrix<T> operator +(Matrix<T> matrix1, Matrix<T> matrix2)
    {
        var m1 = new Matrix<T>();
        m1.Cols = matrix1.Cols;
        m1.Rows = matrix1.Rows;
        m1.Data = ListClone(matrix1.data);

        var m2 = new Matrix<T>();
        m2.Cols = matrix2.Cols;
        m2.Rows = matrix2.Rows;
        m2.Data = ListClone(matrix2.data);

        Matrix<T> result = new Matrix<T>();

        if (m1.Cols!=m2.Cols || m1.Rows!=m2.Rows)
        {
            if (m1.Rows > m2.Rows)
                m2.Rows = m1.Rows;
            else if (m1.Rows < m2.Rows)
                m1.Rows = m2.Rows;
            if (m1.Cols > m2.Cols)
                m2.Cols = m1.Cols;
            else if (m1.Cols < m2.Cols)
                m1.Cols = m2.Cols;

        }

        for (int i = 0; i < m1.Rows; i++)
        {
            result.Add(new List<T>());

            for (int j = 0; j < m1.Cols; j++)
            {
                result[i].Add(new T());
                result[i][j] = Sum<T>(m1[i, j], m2[i, j]);
            }
        }

        result.Cols = m1.Cols;
        return result;           
    }

但是也許有人有更好的成見,該如何做呢?

首先,不要使用List<List<T>>創建矩陣。 只需使用List<T>自己找出訪問運算符。

其次,為什么允許用戶設置行數或列數? 使矩陣不可變,並在構造時固定大小。

public class Matrix<T> : ICloneable
    where T : struct, IComparable, IFormattable, IConvertible, IComparable<T>, IEquatable<T>
{
    private readonly int _rows;
    private readonly int _columns;
    private readonly IList<T> _data;

    public Matrix(int rows, int columns)
    {
        _rows = rows;
        _columns = columns;
        _data = new List<T>(Rows * Columns);
    }

    private Matrix(int rows, int columns, IList<T> data)
    {
        _rows = rows;
        _columns = columns;
        _data = new List<T>(data);
    }

    public int Rows
    {
        get { return _rows; }
    }

    public int Columns
    {
        get { return _columns; }
    }

    public T Element(int row, int column)
    {
        return _data[row * column];
    }

    public object Clone()
    {
        return new Matrix<T>(Rows, Columns, _data);
    }
}

我作為練習離開的其他操作員

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM