如何在C#中实现数组索引器

时间:2013-09-09 22:19:53

标签: c# arrays

我可以输入

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

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

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

修改

感谢您的评论,这是我最终的结果 - 我确实想到了params,但不知道在不知道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来初始化它已经解决的元素,以便在我使用多数组时(主要在单元测试中)避免类外的循环初始化代码。然后我点击intellisense并看到了Initialize方法......虽然它将我限制为默认构造函数和值类型。对于参考类型,将需要扩展方法。我仍然学到了一些东西,是的,当我尝试一个超过32维的数组时,出现了运行时错误。

3 个答案:

答案 0 :(得分:7)

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

您需要为每个维度创建单独的类型 - Matrix1类包含this[int]Matrix2类包含this[int, int],依此类推。< / p>

答案 1 :(得分:6)

您可以使用varargs:

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

你必须自己处理indices可以有任意长度的事实,以你觉得合适的方式。 (例如,根据数组排名检查indices的大小,将其键入Array并使用GetValue()。)

答案 2 :(得分: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添加维度

You'd be wrong

  

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