C# Разделение многомерного массива - PullRequest
0 голосов
/ 05 февраля 2020

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

Проблема: У меня есть 3-мерный массив, который содержит контейнеры. Этот массив предназначен для размещения контейнеров на грузовом судне. Массив состоит из длины, ширины и высоты. Я пытаюсь разбить массив на середину ширины.

Единственное решение, которое я смог отсортировать - это создать 2-мерные массивы, а затем использовать 6 для циклов для копирования большого массива. :

        Container[,,] leftSideOfShip = new Container[ship.length, ((ship.width) / 2), ship.height];
        Container[,,] rightSideOfShip = new Container[ship.length, ((ship.width) / 2), ship.height];
        for(int a = 0; a < ship.length; a++)
        {
            for(int b = 0; b < ship.width/2; b++)
            {
                for(int c = 0; c < ship.height; c++)
                {
                    if(ship.position[a,b,c] != null)
                    {
                        leftSideOfShip[a, b, c] = ship.position[a, b, c];
                    }
                }
            }
        }
        for (int d = 0; d < ship.length; d++)
        {
            for (int e = ship.width/2; e < ship.width; e++)
            {
                for (int f = 0; f < ship.height; f++)
                {
                    if(ship.position[d,e,f] != null)
                    {
                        rightSideOfShip[d, e, f] = ship.position[d, e, f];
                    }
                }
            }
        }

Циклы 3 for для leftSideOfShip работают должным образом, но второй дает исключение indexOutOfRangeException.

Есть ли лучший способ разделить это и если да, то как?

1 Ответ

1 голос
/ 05 февраля 2020

Прежде всего, вы должны помнить, как вы округляете ширину стороны в случае, если ширина корабля нечетная. Например, вы всегда можете предположить, что левая сторона шире, если ширина корабля нечетная, что-то вроде этого:

int leftSideWidth = ship.width % 2 == 0 ? ship.width / 2 : (ship.width / 2) + 1;
int rightSideWidth = ship.width / 2;

Во-вторых, у вас есть ошибка во втором l oop блок: поскольку вы зацикливаетесь for (int e = ship.width/2; e < ship.width; e++) e больше, чем второе измерение массива rightSideOfShip.

Полное решение будет выглядеть примерно так:

Container[,,] leftSideOfShip = new Container[ship.length, leftSideWidth, ship.height];
Container[,,] rightSideOfShip = new Container[ship.length, rightSideWidth, ship.height];

for (int i = 0; i < ship.length; i++)
{
    for (int j = 0; j < ship.width; j++)
    {
        for (int k = 0; k < ship.height; k++)
        {
            if (j < leftSideWidth)
            {
                leftSideOfShip[i, j, k] = ship.position[i, j, k];
            }
            else
            {
                rightSideOfShip[i, j - leftSideWidth, k] = ship.position[i, j, k];
            }
        }
    }
}
...