5

私は文字が打てます

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 私は今これを本当に必要としません。マルチ配列を使用しているときはいつでも(主に単体テストで)クラス外の for ループ初期化コードを回避するために解決された要素を初期化するために Array を拡張する方法を探していました。次に、intellisense を押して、Initialize メソッドを見ましたが、既定のコンストラクターと値の型に制限されています。参照型の場合、拡張メソッドが必要になります。それでも、私は何かを学びました。はい、32 次元を超える配列を試したときに実行時エラーが発生しました。

4

3 に答える 3

7

配列型は魔法のようなものint[]でありint[,]、2 つの異なる型であり、個別のインデクサーを備えています。
これらの型はソース コードでは定義されていません。むしろ、それらの存在と動作は仕様によって記述されています。

次元ごとに個別の型 ( を持つMatrix1クラス、 をthis[int]持つMatrix2クラスなど) を作成する必要がありますthis[int, int]

于 2013-09-09T22:22:38.987 に答える
6

可変引数を使用できます:

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

自分で任意の長さを持つことができるという事実を処理するindices必要があります。(たとえばindices、配列ランクに対して のサイズを確認し、 asArrayと入力して を使用しますGetValue()。)

于 2013-09-09T22:25:38.033 に答える
1

this[]次の演算子を使用します。

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

1 つの演算子で可変数の次元を持つことはできないことに注意してください。各メソッドを個別にコーディングする必要があります。

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 に答える