2012-02-15 10 views
0

私はこのようにアクセスしている3D配列を持っていますArray(int x, int y, int z)。私はそれがxyzを持っているので、私はそれをこのように使用することができます:Array(struct xyz).場合は、どのようにして、構造体を持つことが可能ですか?構造体を多次元配列インデックスとして使用する

私がこれを望んでいるのは、読んだり書いたりするほうが簡単で、書くのが簡単で、エラーが起こりにくいからです。より大きな画像を維持しやすくします。

独自のメソッドを持つクラスを作ることができることは知っていますが、多くのクラスがあり、それをそれぞれに適用すると、構造体を直接使用するとすぐに読みやすくなります。

例:

public struct xyz 
{ 
    public int x, y, z; 

    public xyz(int X, int Y, int Z) 
    { 
     x = X; 
     y = Y; 
     z = Z; 
    } 
} 

private void Test() 
{ 
    int(,,) Array = new int() 
    { 
     { 
      {0,0}, 
      {0,0}, 
     }, 
     { 
      {0,0}, 
      {0,0}, 
     } 
    }; 
    xyz XYZ = new xyz(0,0,0); 
    Array[XYZ] = 1; // this instead of 
    Array[XYZ.x, XYZ.y, XYZ.z] = 1 // this 
} 
+1

は、なぜあなたはC#のケーシングのためのガイドラインのすべてを逆転していますか?それは気を散らしています... – x0n

+0

できますか?いいえ、それは配列の仕組みではありません。しかし、それらを受け入れてそれらを使用する拡張メソッドを作成することができます。 –

+0

質問がC#でタグ付けされている場合、なぜVBインデックス構文を使用していますか? – phoog

答えて

1

あなたは本当の配列をラップ独自の配列クラスを作成し、あなたが欲しいものを行うには、インデクサを提供できます。

class MyArray<T> 
{ 
    private T[,,] array; 

    public MyArray(int xSize, int ySize, int zSize) 
    { 
     array = new T[xSize,ySize,zSize]; 
    } 

    public T this[XYZ xyz] 
    { 
     get { return array[xyz.x, xyz.y, xyz.z]; } 
     set { array[xyz.x, xyz.y, xyz.z] = value; } 
    } 
} 
+0

スヴィクが私の質問に光を当てるまで、それは気付かなかった。彼らは変数のように扱われることを知らなかった。 あなたの答えをありがとう、しかし、1つの事はそれを実現させる、例になるだろうが、私はプログラミングの新人です。 – Eli

1

あなたは簡単にアクセスすることができる独自のコレクションを作成することで、どちらかのあなたは、別途座標すべてを指定することによって、それを達成することができます

public T this[int x, int y, int z] { get { … } set { … } } 

またはあなたのXYZ構造体によって :

public T this[XYZ xyz] { get { … } set { … } } 

配列にそのインデクサを追加することはできません。インデクサは拡張できません。あなたができることは、2つの拡張メソッドを作成することです。

public static T Get<T>(this T[,,] array, XYZ xyz) 
{ 
    return array[xyz.X, xyz.Y, xyz.Z]; 
} 

public static void Set<T>(this T[,,] array, XYZ xyz, T value) 
{ 
    array[xyz.X, xyz.Y, xyz.Z] = value; 
} 

そして、このようにそれを使用します:ような何かあなたがやったように、可変struct Sを作成し、また、

int i = array.Get(xyz); 
array.Set(xyz, 25); 

は、C#で最悪のプラクティスと考えられています。彼らは非常に混乱する可能性があります。

+1

変更可能な構造体は必ずしも悪いとは限りません。単純なPODオブジェクトには何も問題はありません。今では、単にデータを保持するだけでなく、それ以外のものを操作する以外にも、クラスの代わりに構造体を使用しようとしていたら、それは悪いことです。 –

+0

私は公共に関する1つの質問を持っています。この[XYZ xyz] {get} {...}} Arrayを参照する方法がわかりません。 getとsetの中に何を書きますか? – Eli

+0

@Eli、[Andrew Cooperの答え](http://stackoverflow.com/a/9286806/41071)をご覧ください。 – svick

関連する問題