我正在尝试创建自己的矩阵数学类,这是我正在使用的构造函数。
public Matrix (int numRows, int numCols)
{
_matrix = new List<List<double>>(numRows);
// initializes each list
for(int i = 0; i < numRows; i++)
{
_matrix[i] = new List<double>(numCols);
}
}
当我尝试使用它时,它会在行
上抛出ArgumentOutOfRangeException
_matrix [i] =新列表(numCols);
我做错了什么?
答案 0 :(得分:2)
List(Int32) capacity
构造函数参数不设置元素数量;它设定了容量。容量是内部数组的大小 - 而不是集合实际实现的元素数。
由于新列表有0个元素,因为仅设置内部容量,_matrix[anyValue]
超出范围。
如果需要矩阵的LoL(列表列表),使用LINQ创建非常容易。
_matrix = Enumerable.Range(0, numRows)
.Select(r => (new double[numCols]).ToList())
.ToList();
替代LoL生成,手动将每列添加到行,然后将每行添加到矩阵。
_matrix = new List<List<double>>();
for (var r = 0; r < numRows; r++) {
var row = new List<double>();
for (var c = 0; c < numCols; c++) {
row.Add(0);
}
_matrix.Add(row);
}
或者使用AoA(数组数组)和double[][]
结果;当尺寸改变时,列表会更好,这可能不适用于此。
double[][] m = Enumerable.Range(0, numRows)
.Select(r => new double[numCols])
.ToArray();
或者甚至使用Multidimensional Arrays,这可能比上述更合适。由于数组不可调整大小,与“List capacity”参数不同,大小设置边界。
double[,] m = new double[numRows,numCols];
请参阅这些问题,这些问题也与错误使用构造函数参数
有关