如何在C#自定义MatrixND类中实现双索引器以访问元素
实现C# N维矩阵的链式索引访问
首先修正你原代码中的几个问题:
- 构造函数里的
N未定义,需要传入维度参数来初始化数组 - 原单索引器的返回类型错误,
elements[index]是double[],所以索引器返回类型应该是double[]而非double
要实现mymatrix[index1][index2]的链式访问,只需要让类的索引器返回对应维度的子数组即可,具体代码如下:
public class MatrixND { private double[][] elements; // 构造函数:传入行数和每行的列数,初始化二维数组 public MatrixND(int rows, int columns) { elements = new double[rows][]; for (int i = 0; i < rows; i++) { elements[i] = new double[columns]; } } // 单索引器:返回指定行的double[]数组,支持链式访问[index1][index2] public double[] this[int rowIndex] { get { // 添加索引越界检查 if (rowIndex < 0 || rowIndex >= elements.Length) throw new IndexOutOfRangeException("行索引超出范围"); return elements[rowIndex]; } set { if (rowIndex < 0 || rowIndex >= elements.Length) throw new IndexOutOfRangeException("行索引超出范围"); // 可选:检查传入数组的长度是否匹配当前行的长度 if (value.Length != elements[rowIndex].Length) throw new ArgumentException("传入数组长度与行长度不匹配"); elements[rowIndex] = value; } } }
这样你就可以通过以下方式访问元素:
var myMatrix = new MatrixND(3, 3); // 设置元素 myMatrix[0][1] = 5.0; // 获取元素 double value = myMatrix[0][1]; // 得到5.0
额外选项:双参数索引器
如果你还想支持mymatrix[index1, index2]的直接访问方式,可以额外添加一个双参数索引器:
public double this[int rowIndex, int columnIndex] { get { if (rowIndex < 0 || rowIndex >= elements.Length) throw new IndexOutOfRangeException("行索引超出范围"); if (columnIndex < 0 || columnIndex >= elements[rowIndex].Length) throw new IndexOutOfRangeException("列索引超出范围"); return elements[rowIndex][columnIndex]; } set { if (rowIndex < 0 || rowIndex >= elements.Length) throw new IndexOutOfRangeException("行索引超出范围"); if (columnIndex < 0 || columnIndex >= elements[rowIndex].Length) throw new IndexOutOfRangeException("列索引超出范围"); elements[rowIndex][columnIndex] = value; } }
使用方式:
myMatrix[0, 1] = 5.0; double value = myMatrix[0, 1];
内容的提问来源于stack exchange,提问作者Lluis
相关产品推荐
相关产品推荐

