Содержание
Ещё один вид массивов C# – зубчатые массивы или, как их ещё называют – массивы массивов. Массивы массивов представляют из себя последовательность элементов одного типа, но этот тип – массив.
Визуализация массива массивов
Массивы массивов в C# визуально представить следующим образом:

Здесь каждый элемент массива – это массив со своей размерностью. Отсюда и второе название – “зубчатый массив”.
Как создать массив массивов в C#
Массив массивов (или зубчатый массив) создается с использованием следующей конструкции:
int[][] arrayName;
Несколько одря идущих квадратных скобок указывают на то, что перед нами зубчатый массив. Инициализация такого массива производится следующим образом:
int[][] arrayName = new int[5][];
Обратите внимание на то, что размерность указывается для самого массива массивов, то есть только в первых квадратных скобках, а инициализация элементов зубчатого массива производится уже в процессе работы, например, так:
arrayName[0] = new int[5]; //первый элемент - массив на 5 элементов arrayName[1] = new int[2]; //второй элемент - массив на 2 элемента arrayName[2] = new int[3]; //третий элемент - массив на 3 элемента arrayName[3] = new int[2]; //четвертый элемент - массив на 2 элемента arrayName[4] = new int[2]; //пятый элемент - массив на 2 элемента
Если нам необходимо сразу инициализировать массив и заполнить его значениями, то можно воспользоваться вот такой конструкцией:
int[][] arrayName = [
[1, 2, 3, 4],
[1, 2, 3],
[1, 2],
[1]
];
Здесь мы создали массив массивов на четыре элемента, каждый из которых – массив на 4, 3, 2 и 1 элемент. Или так:
int[][] arrayName = new int[3][];
arrayName[0] = new int[2] { 1, 2 };
arrayName[1] = new int[3] { 1, 2, 3 };
arrayName[2] = new int[5] { 1, 2, 3, 4, 5 };
Перебор элементов зубчатого массива C#
В цикле foreach
В отличие от многомерного массива, перебор элементов зубчатого массива с использованием цикла foreachне “разворачивает” массив, так как сами элементы – тоже массивы. Следовательно, перебирать все элементы массивы мы должны следующим образом:
int[][] arrayName = [
[1, 2, 3, 4],
[1, 2, 3],
[1, 2],
[1]
];
foreach (var subArray in arrayName)
{
foreach (var number in subArray)
Console.WriteLine(number);
}
здесь первый (внешний) цикл foreachперебирает элементы основного массива, то есть здесь переменная subArray– это массив. Поэтому во внутреннем цикле мы перебираем элементы обычного одномерного массива и переменная number– это уже число.
В цикле for
С циклом forситуация аналогичная – внешний цикл перебирает массивы, внутренний – элементы подмассивов:
for (var i = 0; i < arrayName.Length; i++)
{
for (j = 0; j < arrayName[i].Length; j++)
{
Console.WriteLine(arrayName[i][j]); //получаем j-й элемент i-го массива
}
}
но, при этом, в цикле forмы оперируем уже индексами массивов, а не их значениями. Результат перебора будет выглядеть следующим образом:

Варианты зубчатых массивов
Следует отметить, что рассмотренная выше конструкция массива – это всего лишь один из возможных вариантов. Так как каждый элемент зубчатого массива сам по себе является массивом, то мы можем создавать самые причудливые их сочетания, например:
string[][][] strings; //массив массива массивов string[][][,] strings2;//массив массивов двумерных массивов
Однако, несмотря на то, что язык C# дает нам возможность создавать таких “монстров”, не стоит этим увлекаться, если только это не чисто исследовательский интерес или крайняя необходимость.
Подведем итог
Массивы массивов (или зубчатые массивы) – это вид массивов в C# в которых каждый элемент сам по себе является массивом. Перебор элементов такого массива осуществляется с использованием вложенных циклов.
Домашнее задание №22
Даны два одномерных массива, размерностью n. Составить из них массив массивов в котором первый элемент будет содержать только положительные значения первого одномерного массива, а второй – отрицательные элементы второго массива. Вывести полученный массив массивов в консоль.