我有一个3D数组,我正在以这种方式访问Array(int x, int y, int z)
。我想知道的是,如果有可能有一个结构,其中包含xyz,那么我可以这样使用它:Array(struct xyz).
如果是,那么如何?
我之所以想要这样做的原因是,我会更容易阅读和写入,并且它会更简单,更不容易出错。使维护更大的图片变得更容易。
我知道我可以创建一个有自己方法的类,但由于我有很多类并将它应用到每个类中会使我快速失去可读性,如果可用的话,直接使用struct将是一个更好的选择。
示例:
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
}
答案 0 :(得分: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
被认为是C#中最糟糕的做法。它们可能非常令人困惑。
答案 1 :(得分: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; }
}
}
答案 2 :(得分:0)
完成@Andrew Cooper的解决方案后,如果您还希望正常访问该矩阵,则必须添加此方法(请看Andrew的代码末尾)
class MyArray<T>
{
private T[,,] array;
// Constructor
public MyArray(int xSize, int ySize, int zSize)
{
array = new T[xSize,ySize,zSize];
}
// Index with your own struct XYZ
public T this[XYZ xyz]
{
get { return array[xyz.x, xyz.y, xyz.z]; }
set { array[xyz.x, xyz.y, xyz.z] = value; }
}
// Normal index
public T this[int x, int y , int z]
{
get { return array[x, y, z]; }
set { array[x, y, z] = value; }
}
// Get dimensions
public int GetLength(int dim)
{
return array.GetLength(dim);
}
}