2012-02-15 24 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 2012-02-15 01:31:05

+0

你能嗎?不,你不能,那不是陣列工作的方式。您可以創建擴展方法,但接受它們並使用它們。 – 2012-02-15 01:31:52

+0

爲什麼在問題標記爲C#時使用VB索引語法? – phoog 2012-02-15 03:42:11

回答

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

謝謝你沒有意識到,直到svick在我的問題上發光。不知道他們會被視爲變數。 感謝您的回答,但有一件事會讓我意識到它,會是一個例子,但我是一個編程新手。 – Eli 2012-02-15 17:31:38

1

就可以輕鬆實現,通過創建自己的集合,可以訪問通過指定所有你單獨座標:

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

或您XYZ結構:

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

您不能將該索引器添加到數組,擴展索引器不可能。你可以做的是創建兩個擴展方法。喜歡的東西:

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; 
} 

,然後用它是這樣的:

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

此外,創建可變struct S,像你這樣,被認爲是在C#中最糟糕的做法。他們可能很混亂。

+1

可變結構不一定是壞的。簡單的POD對象沒有任何問題。現在,如果您試圖使用結構來代替類,而不僅僅是保存數據但操縱數據而不是類,那麼是的,這很糟糕。 – 2012-02-15 04:44:45

+0

我有一個關於公共T的問題[XYZ xyz] {get {...} set {...}} 不知道如何引用數組。 在get和set中寫什麼? – Eli 2012-02-15 08:08:57

+0

@Eli,看看[Andrew Cooper的回答](http://stackoverflow.com/a/9286806/41071)。 – svick 2012-02-15 11:49:42