使用结构作为多维数组索引

时间:2012-02-15 01:29:13

标签: c# multidimensional-array struct indexing int

我有一个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
}

3 个答案:

答案 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);
    }
}
相关问题