Въведение в 2D масиви в 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 )

Концепция на назъбени масиви

A Jagged Array е масив от масиви. Наредените масиви са по същество множество масиви, назъбени заедно, за да образуват многоизмерен масив. Двуизмерен назъбен масив може да изглежда така:

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

Забележете, че всички редове на назъбения масив могат да съдържат или да не съдържат един и същ брой елементи.

True 2D Arrays срещу Jagged Arrays

Jagged Arrays са напълно различни от истински 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 Array реализация в C # започва с декларацията Array. Изглежда по-долу:

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");
)
)
)

продукция

Мощността на всеки цикъл

Цикълът за всеки изпълнява набор от команди за всеки елемент от масива. Това е много мощен цикъл механизъм и силно се препоръчва да се използва, тъй като е по-ефективен от традиционния за контур.

код

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 Array се реализира в C # и какви са различните CRUD операции, които можем да извършим върху него. Научихме и разликата между истинска 2D реализация и назъбен масив. Има много повече методи, достъпни в C #, за да помогнете на разработчиците да работят с Arrays спокойно. Вижте ги в 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