Использовать структуру в качестве индекса многомерного массива - PullRequest
0 голосов
/ 15 февраля 2012

У меня есть 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
}

Ответы [ 2 ]

1 голос
/ 15 февраля 2012

Вы можете создать свой собственный класс массива, который оборачивает реальный массив и предоставляет индексатор для выполнения того, что вы хотите:

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; }
    }
}
1 голос
/ 15 февраля 2012

Вы можете легко добиться этого, создав собственную коллекцию, к которой можно получить доступ, либо указав все координаты по отдельности:

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

Или с помощью вашей XYZ struct:

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 #.Они могут быть очень запутанными.

...