2011-01-06 9 views
5

Cの昔は、配列の添え字を使って非常に便利な方法でストレージを扱うことができました。例えば、配列をそのように宣言することができます。C#の配列添字についての質問

この配列は、8ビットワードのEEPROMイメージを表します。それは本当に多次元ストレージ

BYTE mpuImage[2][512] = eepromImage; 

私は構文が間違ってい確信しているが、私はあなたのアイデアを得る願っていたかのように

BYTE eepromImage[1024] = { ... }; 

は、後でその配列を参照してください。

とにかく、実際には1次元の記憶容量という2次元画像が投影されています。

2次元投影は、16ビットワードのMPUのメモリにロードされたときのEEPROMイメージを表します。

Cでは、記憶域を参照して値を変更することができ、変更された値はほぼ魔法のように実際の(単一次元の)記憶域に表示されます。

C#を使用して同じことを行うことはできますか?

私たちの現在のソリューションは、複数の配列とイベントハンドラを使用して物事を同期させます。このような仕組みがありますが、より良い方法があれば避けたいという複雑さも増しています。

答えて

9

クラスに配列をラップし、1次元と2次元のIndexerプロパティを記述できます。検証などがなければ

それは10×10の配列のために次のようになります。

class ArrayData 
    { 
     byte[] _data = new byte[100]; 

     public byte this[int x]   
     { 
      get { return _data[x]; } 
      set { _data[x] = value; }    
     } 


     public byte this[int x, int y] 
     { 
      get { return _data[x*10+ y]; } 
      set { _data[x*10 + y] = value; } 
     } 
    } 
+0

2パラメータバージョンで計算してもよろしいですか? '_data [x * y]'ではないはずですか? – jjnguy

+0

いいえ、彼は10×10のグリッドを想定しています。 x * width + yのようなものでなければなりません。 – Ian

+0

@jjnguy:いいえ、xx10 + yは10x10の配列に対しては正しいですが、明示していません。編集されました。 –

1

はい、ありません。

必要に応じて、多次元配列をバットから割り出すことができます。基礎となるデータを一次元または多次元のいずれかの方法でアクセスして、基礎となるデータを同期させておくことができるカスタムクラスを作成することもできます。

ただし、多次元インデックスを使用して1次元配列に直接アクセスすることはできません。