5

我可以打字

Square[,,,] squares = new Square[3, 2, 5, 5];
squares[0, 0, 0, 1] = new Square();

事实上,我希望我可以继续向 Int.MaxValue 添加维度,尽管我不知道这需要多少内存。

如何在我自己的类中实现这个变量索引功能?我想封装一个未知维度的多维数组并将其作为属性提供,从而以这种方式启用索引。我必须始终知道数组在这种情况下如何工作的大小吗?

编辑

感谢您的评论,这就是我最终得到的结果-我确实想到了参数,但不知道在不知道 GetValue 之后该去哪里。

class ArrayExt<T>
{
  public Array Array { get; set; }

  public T this[params int[] indices] 
  {
      get { return (T)Array.GetValue(indices); }
      set { Array.SetValue(value, indices);}
  }
}

ArrayExt<Square> ext = new ArrayExt<Square>();
ext.Array = new Square[4, 5, 5, 5];
ext[3, 3, 3, 3] = new Square();

TBH 我现在真的不需要这个。我只是在寻找一种方法来扩展 Array 以初始化其元素,并解决了每当我使用多数组(主要是在单元测试中)时避免类外部的循环初始化代码。然后我点击了智能感知并看到了 Initialize 方法……尽管它限制了我使用默认构造函数和值类型。对于引用类型,将需要扩展方法。我仍然学到了一些东西,是的,当我尝试超过 32 维的数组时出现运行时错误。

4

3 回答 3

7

数组类型很神奇——int[]并且int[,]是两种不同的类型,具有单独的索引器。
这些类型没有在源代码中定义;相反,它们的存在和行为由规范描述。

您需要为每个维度创建一个单独的类型——一个Matrix1带有 a的类this[int],一个带有 a 的Matrix2this[int, int],等等。

于 2013-09-09T22:22:38.987 回答
6

您可以使用可变参数:

class Squares {
    public Square this[params int[] indices] {
        get {
            // ...
        }
    }
}

您必须自己处理indices可以有任意长度的事实,以您认为合适的方式。(例如检查indices数组等级的大小,将其键入Array并使用GetValue()。)

于 2013-09-09T22:25:38.033 回答
1

使用this[]运算符:

public int this[int i, int j]
{
    get {return 1;}
    set { ; }
}

请注意,您不能在一个运算符中拥有可变数量的维度 - 您必须分别对每种方法进行编码:

public int this[int i, int j, int k]
{
    get {return 1;}
    set { ; }
}
public int this[int i, int j]
{
    get {return 1;}
    set { ; }
}
public int this[int i]
{
    get {return 1;}
    set { ; }
}

我希望我可以继续向 Int.MaxValue 添加维度

你错了

一个数组最多可以有 32 个维度。

于 2013-09-09T22:23:33.097 回答