0
我有一个类Matrix
,并尝试重载此类中的+运算符。 问题出在matrix1
和matrix2
,我无法创建这个对象的克隆。我甚至已经尝试使用几个for
循环,但它会抛出OutOfMemoryException
。C#克隆通用
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;
}
但也许有人有更好的idiea如何做到这一点easer?
第一和第二,必须是这样的,包括单元测试,我有....不是我的选择 – Spam
那么,你的'ListClone'方法可以很容易地减少到一行 'var newData = data.Select(x => new List(x))。ToList();' –