Введение в 2D-массивы в C #

Двумерные массивы представляют собой набор однородных элементов, которые охватывают несколько строк и столбцов, принимая форму матрицы. Ниже приведен пример двумерного массива, который имеет 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 ) )

Обратите внимание, что все строки зубчатого массива могут содержать или не содержать одинаковое количество элементов.

True 2D Arrays vs Jagged Arrays

Зубчатые массивы полностью отличаются от настоящего 2D-массива с точки зрения реализации. Важно понимать, как C # реализует как многомерные массивы, так и зубчатые массивы.

Языки программирования отличаются реализацией многомерных массивов. Некоторые языки программирования, такие как C, C ++, C #, Fortran и т. Д., Поддерживают настоящие двумерные массивы. В то время как есть другие, которые имитируют это поведение с массивами массивов, которые также называются неровными. Итак, чем же настоящий двумерный массив отличается от зубчатых массивов?

Две реализации многомерных массивов отличаются с точки зрения потребления памяти. Хотя истинный 2D-массив будет иметь по m строк по n элементов в каждой, зубчатый массив может иметь по m строк, каждая из которых имеет разное количество элементов. Это приводит к минимуму потерянного пространства для наборов данных. Таким образом, массив с неровными краями отлично подходит:

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

Если бы тот же набор данных был реализован в истинном двумерном массиве, он был бы таким, как показано ниже:

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

Операции над 2D-массивами в C #

Здесь приведены некоторые операции над 2D-массивами:

1. Построить C # 2D Array

Давайте посмотрим, как объявлять 2D-массив в C #, а также как не объявлять 2D-массив в C #.

Как?

Реальная реализация 2D Array в C # начинается с объявления Array. Это выглядит ниже:

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

Количество запятых в определении определяет размерность массива. Обратите внимание, что вы не можете указать размер массива в объявлении массива. Это должно быть сделано во время инициализации массива.

Как не надо?

Легко запутаться между реализациями 2D-массивов и зубчатых массивов. Объявление зубчатого массива выглядит следующим образом:

int()() jagged array;

2. Инициализируйте C # 2D Array

Следующим шагом будет инициализация двумерного массива, который мы только что объявили. Есть несколько способов сделать это.

Использование нового оператора

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-массива. Поскольку двумерный массив представляет собой матрицу из mxn элементов, каждый элемент имеет назначенную комбинацию индекса строки и индекса столбца. Мы можем получить доступ к элементам, указав в индексе row-index и column-index. Пример ниже:

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) - последним элементом массива.

Читать все элементы

Но вышеприведенный метод дает нам значение одного элемента в массиве. Как нам пройти весь массив, чтобы прочитать каждый его элемент? Простым решением является циклический просмотр всего массива с использованием вложенных циклов for / 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-each выполняет набор команд для каждого элемента массива. Это очень мощный механизм зацикливания, и его настоятельно рекомендуется использовать, поскольку он более эффективен, чем традиционный цикл for.

Код

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 Array

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

Код

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 Array

Мы обновим наш массив, чтобы умножить каждый элемент на 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 Array

Это сложная операция. Невозможно удалить один элемент из настоящего массива 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");
)
)
)

Выход

Вывод

Таким образом, мы увидели, как двумерный массив реализован в C # и какие различные операции CRUD мы можем выполнить над ним. Мы также узнали разницу между истинной 2D-реализацией и зубчатым массивом. В C # доступно намного больше методов, чтобы помочь разработчикам в работе с массивами. Проверьте их в документах MSDN.

Рекомендуемые статьи

Это руководство по 2D-массивам в C #. Здесь мы обсуждаем концепцию зубчатых массивов вместе с операциями над двумерными массивами в C #. Вы также можете посмотреть следующие статьи, чтобы узнать больше

  1. 2D массивы в Java
  2. 2D массивы в Python
  3. Массивы в C #
  4. Массивы в C ++
  5. Массивы в PHP
  6. 2D-графика в Java
  7. Как работают массивы и списки в Python?
  8. Многомерные массивы в C ++ с примерами
  9. 2D массивы в PHP