Как проверить, что зубчатый массив не многомерен в C# - PullRequest
1 голос
/ 11 апреля 2020

У меня есть матрица, которая является зубчатым массивом. Матрица бывает разных размеров, например:

char[][] grid1 = {
    new char[] { '1', '1', '0', '1', '0' },
    new char[] { '1', '1', '0', '0', '0' },
    new char[] { '0', '0', '0', '0', '0' }
};

char[][] grid2 = {
    new char[] { '1' }
};

У меня проблема в том, что мне нужно l oop над матрицей, чтобы получить или установить ее элементы. Я делаю это, используя вложенное значение для l oop, например:

for (int i = 0; i < grid.Length; i++)
{
    for (int j = 0; j < grid[1].Length; j++)
    {
        System.Console.Write(grid[i][j]);
    }
}

Вышеуказанный l oop отлично работает на grid1, потому что он многомерен. Но я получаю ошибку для grid2, потому что он имеет только одно измерение. Ошибка возникает, когда я использую "grid [1] .Length". Я попробовал «GetLength (1)», но у меня возникла та же проблема, потому что второго измерения не существует.

Как проверить, что матрица многомерна, чтобы избежать возникновения исключения? Кроме того, есть ли у них путь к l oop зубчатому массиву независимо от того, сколько он имеет измерений?

Ответы [ 3 ]

1 голос
/ 11 апреля 2020

Если вы уверены, что зубчатый массив образует матрицу (т. Е. Каждый подмассив имеет одинаковую длину), вы можете сделать:

for (int i = 0; i < grid.Length; i++)
{
    // we can be sure that grid[0] always exist it ever goes into the outer loop
    for (int j = 0; j < grid[0].Length; j++)
    {
        System.Console.Write(grid[i][j]);
    }
}

Но если это так, вы можете просто использовать 2D-массив char[,] вместо зубчатого массива!

char[,] grid1 = {
    { '1', '1', '0', '1', '0' },
    { '1', '1', '0', '0', '0' },
    { '0', '0', '0', '0', '0' }
};

for (int i = 0 ; i < grid1.GetUpperBound(0) ; i++) {
    for (int j = 0 ; j < grid1.GetUpperBound(1) ; i++) {
        System.Console.Write(grid[i, j]);
    }
}

Если каждый вложенный массив может иметь различную длину, вы можете использовать grid[i] для доступа к каждой из их длин:

for (int i = 0; i < grid.Length; i++)
{
    for (int j = 0; j < grid[i].Length; j++)
    {
        System.Console.Write(grid[i][j]);
    }
}
1 голос
/ 11 апреля 2020

Jagged массив всегда является многомерным по объявлению. char [] [] означает, что у вас есть массив массивов символов. Вы не можете передать char вместо char [] в элемент char [0] массива, это приведет к ошибке во время компиляции. Поэтому мы никогда не проверяем, если он многомерный, компилятор делает это вместо нас.

Ваша настоящая проблема - использовать 2-ую строку для получения длины любой строки, к которой вы хотите получить доступ. Вам всегда нужно указывать длину строки, к которой вы хотите получить доступ.

for (int i = 0; i < grid.Length; i++)
{
    for (int j = 0; j < grid[i].Length; j++)
    {
        System.Console.Write(grid[i][j]);
    }
}

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

char[][] grid = new int[3][];

У вас есть массив следующего объявления. После этого объявления у вас всегда есть 3 строки, но в них по-прежнему нет данных. Это массив из 3 нулей. Таким образом, предыдущий код не будет работать. Если вы не уверены, инициализированы ли все ваши строки с помощью зубчатых неровностей, проверьте, не является ли оно нулевым.

for (int i = 0; i < grid.Length; i++)
{
    if (grid[i] != null)
    {
        for (int j = 0; j < grid[i].Length; j++)
        {
            System.Console.Write(grid[i][j]);
        }
    }
}
1 голос
/ 11 апреля 2020

РЕДАКТИРОВАТЬ: не думаю, что это на самом деле решает вашу проблему, но парень в комментариях кажется правильным, используйте grid[0].

for (int i = 0; i < grid.Length; i++)
{
    // Check if the current value is an array, if not display the value instead.
    if(grid[i] != typeof (char[])
    {
        System.Console.Write(grid[i]);
        continue;
    }

    for (int j = 0; j < grid[1].Length; j++)
    {
        System.Console.Write(grid[i][j]);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...