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

5
我可以打字
Square[,,,] squares = new Square[3, 2, 5, 5];
squares[0, 0, 0, 1] = new Square();

事实上,我希望我可以继续添加到Int.MaxValue的维度,尽管我不知道那需要多少内存。
如何在自己的类中实现此变量索引功能?我想要封装一个未知维度的多维数组,并将其作为属性提供,从而使索引成为可能。必须始终知道大小吗?如果是这样,那么Array是如何工作的?
编辑:
感谢评论,以下是我的最终代码 - 我考虑了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();

说实话,我现在并不需要这个。我只是在寻找一种方法来扩展数组,并初始化其元素以避免在使用多维数组时在类外部编写for循环初始化代码(主要用于单元测试)。然后,我看到了Intellisense和Initialize方法......虽然它限制了我只能使用默认构造函数和值类型。对于引用类型则需要使用扩展方法。尽管如此,我还是学到了一些东西,但是当我尝试使用超过32个维度的数组时,出现了运行时错误。


提供一些关于如何处理未知维度的多维数组的上下文可能会有所帮助。因为在.NET的类型系统中并没有直接支持这种情况的方式。 - millimoose
3个回答

7

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

您需要为每个维度创建一个单独的类型 - 使用this [int] Matrix1 类,使用this [int,int] Matrix2 类,依此类推。


你也可以为通用的 Matrix 类型添加一个 this[params int[] indices] 索引器,并将其转换为...适合 OP 的任何内容。(我不太清楚他们想要什么。) - millimoose
@millimoose:是的,但那不会是类型安全的。 - SLaks
确实不是,但如果OP确实需要使用一个未知秩的数组,那就隐含了这一点。(他们可能并不需要,因此我在问题上发表了评论。) - millimoose

6
你可以使用可变参数(varargs):
class Squares {
    public Square this[params int[] indices] {
        get {
            // ...
        }
    }
}

您需要自己处理 indices 可以具有任意长度的事实,使用您认为合适的方式。例如,检查 indices 的大小与数组秩相比较,将其类型化为 Array 并使用 GetValue() 方法。


@SLaks 谢谢,我加了那个而不是犹豫不决。 - millimoose

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个维度。


@millimoose:我不认为那是真的。 - SLaks
“我该如何在自己的类中实现这个变量索引功能?” - D Stanley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接