You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 21:13:12