Вступ у двовимірні масиви в C #

Двовимірні масиви - це сукупність однорідних елементів, що перетинаються на кілька рядків і стовпців, приймаючи форму матриці. Нижче наведено приклад 2D масиву, який має m рядків і n стовпців, створюючи таким чином матрицю конфігурації mxn.

( a1, a2, a3, a4, …, an
b1, b2, b3, b4, …, bn
c1, c2, c3, c4, …, cn
.
.
.
m1, m2, m3, m4, …, mn )

Концепція зубчастих масивів

Jagged Array - це масив масивів. Зазубровані масиви - це по суті кілька масивів, зв'язаних між собою, утворюючи багатовимірний масив. Двовимірний зубчастий масив може виглядати приблизно так:

( ( a1, a2, a3, a4, …, an ),
( b1, b2, b3, b4, …, b20 ),
( c1, c2, c3, c4, …, c30 ),
.
.
.
( m1, m2, m3, m4, …, m25 ) )

Зауважте, що всі рядки нерівного масиву можуть містити або не містити однакову кількість елементів.

Справжні 2D масиви проти зазубрених масивів

Зазубровані масиви є абсолютно іншими, ніж справжній 2D масив з точки зору реалізації. Важливо зрозуміти, як C # реалізує як багатовимірні масиви, так і нерівні масиви.

Мови програмування відрізняються своєю реалізацією багатовимірних масивів. Деякі мови програмування, такі як C, C ++, C #, Fortran тощо, підтримують справжні 2D-масиви. Хоча є й інші, які моделюють цю поведінку з масивами масивів, які називаються нерівними масивами. Отже, чим справжній двовимірний масив відрізняється від зубчастих масивів?

Дві реалізації багатовимірних масивів відрізняються за рівнем споживання сховища. У той час як справжній 2D масив матиме m рядків з n елементів кожен, нерівний масив може мати m рядків, кожен з яких має різну кількість елементів. Це призводить до мінімально витраченого місця для наборів даних. Таким чином, нижче зазублений масив ідеально добре:

int()() jagged array = ( (1, 2, 3, 4),
(5, 6, 7),
(8, 9) )

Якби той самий набір даних мав би бути реалізований у справжньому 2D-масиві, це було б, як показано нижче:

int(, ) multiDimArray = ( 1, 2, 3, 4
5, 6, 7, 0
8, 9, 0, 0 )

Операції на 2D-масивах у C #

Ось деякі операції над 2D-масивами, наведеними нижче:

1. Побудувати масив C # 2D

Давайте подивимось, як оголосити 2D масив у C # та інший спосіб, як не оголосити 2D масив у C #.

Як?

Справжня реалізація 2D масиву в C # починається з декларації масиву. Це виглядає приблизно так:

int(, ) arr2D;
string(, ) arr2D_s;

Кількість коми у визначенні визначає розмірність масиву. Зауважте, що ви не можете вказати розмір масиву в декларації масиву. Це потрібно зробити під час ініціалізації масиву.

Як не робити?

Легко заплутатися між реалізаціями 2D-масивів та нерівними масивами. Нерівна заява масиву виглядає нижче:

int()() jagged array;

2. Ініціалізуйте масив C # 2D

Наступний крок - ініціалізація 2D-масиву, який ми щойно оголосили. Існує кілька способів зробити це.

Використання нового оператора

arr2D = new int(2, 3); //separate initialization
string(, ) arr2D_s = new string(4, 5); //with declaration

Ініціалізація зі значеннями

//without dimensions
arr2D = new int(, )((1, 2), (3, 4), (5, 6));
//with declaration
arr2D_s = new string(2, 2)((“one”, ”two”), (“three”, “four”));

Без нового оператора

Int(, ) arr2D_a = ((1, 2), (3, 4), (5, 6), (7, 8));

3. Прочитайте елементи з масиву C # 2D

Прочитайте один елемент

Наступною операцією є зчитування елементів з 2D масиву. Оскільки 2D масив є матрицею mxn елементів, кожен елемент має призначені комбінації рядків-індексів та стовпців-індексів. Ми можемо отримати доступ до елементів, надавши індекс-рядок та індекс стовпців. Приклад нижче:

int(, ) arr2D_i = ((1, 2), (3, 4), (5, 6), (7, 8));
string arr2D_s = ((“one”, ”two”), (“three”, “four”));
int val_i = arr2D_i(2, 1); //returns '6'
string val_s = arr2D_s(1, 1); //returns 'four'

Примітка . Індекси рядків і стовпців починаються з 0. Таким чином, позиція індексу (0, 0) є першим елементом і (m-1, n-1) останнім елементом масиву.

Прочитайте всі елементи

Але, описаний вище метод дає нам значення одного елемента в масиві. Як ми можемо пройти весь масив, щоб прочитати кожен його елемент? Просте рішення - це прокручування всього масиву з використанням вкладених циклів для / while.

Код

using System;
public class Program
(
public static void Main()
(
int(, ) arr2D_i = new int(3, 3)((1, 2, 3), (4, 5, 6), (7, 8, 9));
//reading all the elements through for loop
for (int i = 0; i < 3; i++)
(
for (int j = 0; j < 3; j++)
(
Console.Write(arr2D_i(i, j) + "\t");
)
Console.WriteLine("\n");
)
)
)

Вихід

Метод GetLength ()

Добре. Але, наведений вище приклад працює лише тоді, коли я заздалегідь знаю кількість елементів у масиві. Що робити, якщо мій масив динамічний? Як я проходжу всі елементи динамічного масиву? Тут нам допомагає метод GetLength.

int arr2D.GetLength (0); // повертає перший вимір (рядки)

int arr2D.GetLength (1); // повертає другий вимір (стовпці)

Код

using System;
public class Program
(
public static void Main()
(
int(, ) arr2D_i = new int(3, 3)((1, 2, 3), (4, 5, 6), (7, 8, 9));
//reading all the elements through for loop
for (int i = 0; i < arr2D_i.GetLength(0); i++)
(
for (int j = 0; j < arr2D_i.GetLength(1); j++)
(
Console.Write(arr2D_i(i, j) + "\t");
)
Console.WriteLine("\n");
)
)
)

Вихід

Потужність для кожного циклу

Цикл for-every виконує набір команд для кожного елемента масиву. Це дуже потужний циклічний механізм і його настійно рекомендується використовувати, оскільки він є більш ефективним, ніж традиційний для циклу.

Код

using System;
public class Program
(
public static void Main()
(
string(, ) arr2D_s = new string(3, 3)(("one", "two", "three"), ("four", "five", "six"), ("seven", "eight", "nine"));
//reading all the elements through foreach loop
foreach(var ele in arr2D_s)
(
Console.WriteLine(ele);
)
)
)

Вихід

4. Вставте елементи в масив C # 2D

Тепер давайте подивимось приклад того, як вставляти елементи в масив C # 2D. Ідея полягає в тому, щоб пройти кожну позицію масиву і призначити йому значення.

Код

using System;
public class Program
(
public static void Main()
(
int(, ) arr2D_i = new int(3, 3)((1, 2, 3), (4, 5, 6), (7, 8, 9));
int(, ) squares = new int(3, 3);
int(, ) cubes = new int(3, 3);
for (int i = 0; i < arr2D_i.GetLength(0); i++)
(
for (int j = 0; j < arr2D_i.GetLength(1); j++)
(
squares(i, j) = arr2D_i(i, j) * arr2D_i(i, j);
cubes(i, j) = squares(i, j) * arr2D_i(i, j);
)
)
Console.WriteLine("Squares\n");
DisplayArray(squares);
Console.WriteLine("\n\nCubes\n");
DisplayArray(cubes);
)
static void DisplayArray(int(, ) arr)
(
for (int i = 0; i < arr.GetLength(0); i++)
(
for (int j = 0; j < arr.GetLength(1); j++)
( Console.Write(arr(i, j) + "\t"); )
Console.WriteLine("\n");
)
)
)

Вихід

5. Оновлення елементів у масиві C # 2D

Ми оновимо наш масив, щоб помножити кожен елемент на 2. Ідея полягає у переході кожної позиції масиву та оновленні значення, яке він має.

Код

using System;
public class Program
(
public static void Main()
(
int(, ) arr2D_i = new int(3, 3)((1, 2, 3), (4, 5, 6), (7, 8, 9));
Console.WriteLine("Original Array\n");
DisplayArray(arr2D_i);
for (int i = 0; i < arr2D_i.GetLength(0); i++)
(
for (int j = 0; j < arr2D_i.GetLength(1); j++)
(
arr2D_i(i, j) *= 2;
)
)
Console.WriteLine("\n\nUpdated Array (multiplied by 2)\n");
DisplayArray(arr2D_i);
)
static void DisplayArray(int(, ) arr)
(
for (int i = 0; i < arr.GetLength(0); i++)
(
for (int j = 0; j < arr.GetLength(1); j++)
(
Console.Write(arr(i, j) + "\t");
)
Console.WriteLine("\n");
)
)
)

Вихід

6. Видаліть елементи з масиву C # 2D

Це хитра операція. Видалити один елемент із справжнього масиву C # 2D неможливо. Видалення одного елемента порушить розміри масиву таким чином, що він більше не буде матрицею. C # не дозволяє цього, якщо це не зубчастий масив.

Отже, яке рішення? Чи видаляємо ми весь рядок або весь стовпець? Ні, C # також не дозволить цього. Масив фіксується за розміром при оголошенні або ініціалізації. Він має виправлені байти пам'яті. Ми не можемо змінити це під час виконання.

Тут є рішення створити новий масив без елементів, які ми хочемо видалити.

Код

using System;
public class Program
(
public static void Main()
(
int(, ) arr2D_i = new int(3, 3)((1, 2, 3), (4, 5, 6), (7, 8, 9));
int(, ) new_array = new int(2, 2);
Console.WriteLine("Original Array\n");
DisplayArray(arr2D_i);
int rowToDel = 2;
int colToDel = 2;
for (int i = 0; i < arr2D_i.GetLength(0); i++)
(
if(i==rowToDel)
continue;
for (int j = 0; j < arr2D_i.GetLength(1); j++)
(
if(j==colToDel)
continue;
new_array(i, j)=arr2D_i(i, j);
)
)
Console.WriteLine("\n\nArray after deleting elements\n");
DisplayArray(new_array);
)
static void DisplayArray(int(, ) arr)
(
for (int i = 0; i < arr.GetLength(0); i++)
(
for (int j = 0; j < arr.GetLength(1); j++)
(
Console.Write(arr(i, j) + "\t");
)
Console.WriteLine("\n");
)
)
)

Вихід

Висновок

Таким чином, ми бачили, як 2D масив реалізується в C # і які різні операції CRUD ми можемо виконувати на ньому. Ми також дізналися різницю між справжньою двовимірною реалізацією та нерівним масивом. У C # доступно набагато більше методів, щоб допомогти розробникам легко працювати з масивами. Перевірте їх у документах MSDN.

Рекомендовані статті

Це посібник із 2D-масивів у C #. Тут ми обговорюємо концепцію нерівних масивів разом з операціями над 2D масивами в C #. Ви також можете переглянути наступні статті, щоб дізнатися більше -

  1. 2D масиви на Java
  2. 2D масиви в Python
  3. Масиви в C #
  4. Масиви в C ++
  5. Масиви в PHP
  6. 2D графіка на Java
  7. Як працюють масиви та списки в Python?
  8. Багатовимірні масиви в C ++ з прикладами
  9. 2D масиви в PHP