Двовимірний масив можна представити у вигляді таблиці, в якій довжина кожного рядка залишається незмінною по всьому масиву. Але в C# можна також створювати спеціальний тип двовимірного масиву, який називається ступінчатим масивом.
Ступінчатий масив представляє собою масив масивів, у якому довжина кожного масиву може бути різною. Отже, ступінчатий масив може бути використаний для складання таблиці з рядків різної довжини.
Ступінчаті масиви оголошуються за допомогою ряду квадратних дужок, у яких вказується їх розмірність. Наприклад, для оголошення двовимірного ступінчатого масиву служить наступна загальна форма: тип [][] ім'я масиву = new тип[розмір] [];
де розмір позначає кількість рядків у масиві. Пам'ять для самих рядків розподіляється індивідуально, і тому довжина рядків може бути різною.
Розглянемо приклад використання ступінчатого масиву:
class Program
{
static void Main(string[] args)
{
int i = 0;
int j = 0;
// Оголошення ступінчастого масиву (jagged array)
int[][] myArr = new int[5][];
for (i = 0; i < 5; i++)
myArr[i] = new int[i + 1];
// Ініціалізація ступінчастого масиву
for (i = 0; i < 5; i++)
{
for (j = 0; j < i + 1; j++)
{
myArr[i][j] = i + 1;
}
}
// Виведення масиву на екран
for (i = 0; i < 5; i++)
{
Console.WriteLine();
for (j = 0; j < i + 1; j++)
{
Console.Write("{0}\t", myArr[i][j]);
}
}
Console.ReadKey();
}
}
1
2 2
3 3 3
4 4 4 4
5 5 5 5 5
Ще один приклад використання ступінчатого масиву:
class Program
{
static void Main(string[] args)
{
int i = 0;
int j = 0;
// Оголошуємо ступінчатий масив (jagged array)
int[][] myArr = new int[5][];
Random rand = new Random();
int t1; // Тимчасова змінна для зберігання розміру підмасиву
// Ініціалізуємо ступінчатий масив випадковими значеннями
for (i = 0; i < 5; i++)
{
t1 = rand.Next(10); // Генеруємо випадковий розмір підмасиву (до 10 елементів)
myArr[i] = new int[t1];
for (j = 0; j < t1; j++)
myArr[i][j] = rand.Next(50, 100); // Заповнюємо випадковими числами від 50 до 100
}
// Виводимо масив на екран
for (i = 0; i < 5; i++)
{
Console.WriteLine();
foreach (int x in myArr[i])
{
Console.Write("{0}\t", x); // Виводимо елементи через табуляцію
}
}
Console.ReadKey(); // Очікуємо натискання клавіші
}
}
67 89 53 78
91 55
84 72 93 61 88
57 65 74
76 83 94
Розглянемо приклад використання ступінчатого масиву:
static void Main(string[] args)
{
int i = 0;
// Оголошення ступінчастого масиву
int[][] myArr = new int[4][];
myArr[0] = new int[4];
myArr[1] = new int[6];
myArr[2] = new int[3];
myArr[3] = new int[4];
// Ініціалізація та виведення першого підмасиву
for (; i < 4; i++)
{
myArr[0][i] = i+1;
Console.Write("{0}\t", myArr[0][i]);
}
Console.WriteLine();
// Ініціалізація та виведення другого підмасиву
for (i = 0; i < 6; i++)
{
myArr[1][i] = i+1;
Console.Write("{0}\t", myArr[1][i]);
}
Console.WriteLine();
// Ініціалізація та виведення третього підмасиву
for (i = 0; i < 3; i++)
{
myArr[2][i] = i+1;
Console.Write("{0}\t", myArr[2][i]);
}
Console.WriteLine();
// Ініціалізація та виведення четвертого підмасиву
for (i = 0; i < 4; i++)
{
myArr[3][i] = i+1;
Console.Write("{0}\t", myArr[3][i]);
}
Console.ReadKey();
}
1 2 3 4
1 2 3 4 5 6
1 2 3
1 2 3 4
Ще один приклад використання ступінчатого масиву:
static void Main(string[] args)
{
int j, max = 0;
int[] MyArr = new int[5];
// Заповнення масиву та знаходження максимального значення
for (j = 0; j < 5; j++)
{
MyArr[j] = j + 2;
if (MyArr[j] > max) max = MyArr[j];
}
// Розрахунок розмірів для ступінчастого масиву
int size0 = 5;
int size1 = max;
int size2 = Convert.ToInt32((4 * max - 1) / 3);
int[] sizes = { size0, size1, size2 }; // Допоміжний масив розмірів
// Створення ступінчастого масиву
int[][][] MyStArr = new int[3][][];
MyStArr[0] = new int[sizes[0]];
MyStArr[1] = new int[sizes[1]];
MyStArr[2] = new int[sizes[2]];
// Виведення заголовків
Console.WriteLine();
Console.Write(" ");
for (j = 0; j < size2; j++)
Console.Write("({0,5})", j);
Console.WriteLine("\n\t --- ");
// Заповнення та виведення першого підмасиву
Console.Write(" MyStArr[0][5]");
for (j = 0; j < size0; j++)
MyStArr[0][j] = j + 1;
foreach (int jj in MyStArr[0])
Console.Write("({0,5})", jj);
Console.WriteLine();
// Заповнення та виведення другого підмасиву
Console.Write(" MyStArr[1][6]");
for (j = 0; j < size1; j++)
MyStArr[1][j] = j + 11;
foreach (int jj in MyStArr[1])
Console.Write("({0,5})", jj);
Console.WriteLine();
// Заповнення та виведення третього підмасиву
Console.Write(" MyStArr[2][7]");
for (j = 0; j < size2; j++)
MyStArr[2][j] = j + 111;
foreach (int jj in MyStArr[2])
Console.Write("({0,5})", jj);
Console.WriteLine("\n\t --- ");
Console.ReadKey();
}

Усі масиви є об'єктами і вони мають деякі властивості. Найкориснішою для нас буде властивість Length, яка повертає кількість елементів у масиві (у всіх розмірностях)
static void Main(string[] args)
{
int[] numbers = new int[5];
int size = numbers.Length; // size = 5
}
Ступінчаті масиви знаходять корисне застосування не у всіх, а лише у деяких випадках. Наприклад, якщо потрібен дуже довгий двовимірний масив, який заповнюється не повністю, тобто такий масив, у якому використовуються не всі, а лише окремі його елементи, то для цієї мети ідеально підходить ступінчатий масив.
І останнє зауваження: ступінчаті масиви представляють собою масиви масивів, і тому вони не обов'язково повинні складатися з одновимірних масивів. Наприклад, у наведеному нижче рядку коду створюється масив двовимірних масивів.
int[][,] jagged = new int[3][,];
У наступному рядку коду елементу масиву jagged[0] присвоюється посилання на масив розмірами 4:2. jagged[0] = new int[4, 2];
А у наведеному нижче рядку коду елементу масиву jagged[0][1,0] присвоюється значення змінної i. jagged[0][1,0] = i;
class Program
{
static void Main(string[] args)
{
int[,] c = new int[,] { { 1, 2, 3 }, { 4, 5, 6 }, { 7,8,9} };
int[] a = new int[3] ;
for (int j=0; j < 3; j++) a[j] = c[2, j];
foreach (int i in a) Console.WriteLine(i);
Console.WriteLine();
int[][] d = new int[3][];
d[0] = new int[2] { 1, 2 }; // виділяємо пам'ять для першого підмасиву
d[1] = new int[3] { 1, 2, 3 }; // виділяємо пам'ять для другого підмасиву
d[2] = new int[5] { 1, 2, 3, 4, 5 };
foreach (int i in d[2]) Console.WriteLine(i);
Console.ReadKey();
}
}