Массивы, и как ими управлять

в 7:06, , рубрики: зубчатые, изменение массива, массивы, многомерные

Всем привет.

Начну с самого общеизвестного. Массив можно охарактеризовать как совокупность данных с общим именем для обращения.
Массивы в C# могут быть:

1) Одномерный (Линейный, векторный)
2) Двумерный (Матричный, массив массивов)
3) Многомерные (Трехмерные и более)
4) Ступенчатые (Зубчатые, Jagged)

Одномерный массив.
Структуру массива можно представить в виде:

Массивы, и как ими управлять

Объявить и инициализировать массив можно:
1) Самый простой способ:

int[] arr = new int [13] {1,1,1,1,1,1,1,1,1,1,1,1,1};

2) Еще один метод, более объемный:

int[] arr = new int[13];
            foreach (int index in arr) { arr[index] = 1; };

3) Существует еще один метод. Но более затратный для памяти:

int[] arr = Enumerable.Repeat(1, 13).ToArray();

По умолчанию при объявлении массива, его элементы инициализируются значением 0 для типа int, для типа bool = false, для типа string = null, для char = '' (Null character) С объявлениями разобрались, теперь поговорим об изменении массива.
Элемент массива можно изменить так:

arr[1] = 2;

Если необходимо изменить весь массив, можно изменять в цикле, предпочтительном вам

for (int index = 0; index < arr.Length - 1;index++ )
            { arr[index] = 2; };

Размерность массива можно изменить так:

Array.Resize(ref arr, 14);

На этом со скучными одномерными массивами закончим, и перейдем к двумерным.
Структуру двумерного массива можно представить так:

Длина такого массива будет равна 12. Объявление и инициализация массива:

int[,] arr = new int[3, 4] {
                {1,1,1,1},
                {1,1,1,1},
                {1,1,1,1}
            };

Так же можно инициализировать в цикле. Элемент массива можно изменить с помощью обращения вида:
ИМЯ_МАССИВА [ИНДЕКС СТРОКИ, ИНДЕКС СТОЛБЦА] = ЗНАЧЕНИЕ;
Размер массива изменить немного сложнее, чем для одномерного, поскольку встроенный метод Array.Resize(ref [], int) предназначен только для одномерных массивов.
Поскольку это массив массивов, то вроде бы логично использовать вложенный цикл для использования метода Array.Resize. Но это будет занимать много памяти, поэтому следует от этого отказаться. Существует такой метод как Array.Copy с помощью его можно изменить размер двумерного массива. Для начала необходимо создать новый массив с нужными размерами, после чего можно скопировать из оригинала.

Array.Copy(arr, newArr, arr.Length); 

Все это следует перенести в отдельный метод, который можно будет использовать.

public static void ResizeArray(ref int[,] arr, int columns, int rows)
        {
            int[,] newArray = new int[rows, columns];
            Array.Copy(arr, newArray, arr.Length);
            arr = newArray;}

С помощью этого метода можно изменить двумерный массив типа int. Для того чтобы изменять двумерные массивы любого типа, необходимо внести изменения в метод добавив обобщения.

public static void ResizeArray<T>(ref T[,] arr, int columns, int rows)
        {
            T[,] newArray = new T[rows, columns];
            Array.Copy(arr, newArray, arr.Length);
            arr = newArray;
        }

Теперь перейдем к многомерным массивам.

Многомерные массивы могут быть и более чем трехмерные. Объявление таких массивов выглядит так:

int[, ,] arr = new int[2, 5, 2];//- Объявление трехмерного массива
int[, ,..,] arr = new int[2, 5,..,];//-Объявление более чем трехмерного массива

Заполнять такие массивы наиболее разумно во вложенных циклах. Приведу пример для четырехмерного.

for (int i0=0;i0<=arka.GetLength(0)-1;i0++)
            {   for (int i1 = 0; i1 <= arka.GetLength(1) - 1; i1++)
                {   for (int i2 = 0; i2 <= arka.GetLength(2) - 1; i2++)
                    {   for (int i3 = 0; i3 <= arka.GetLength(3) - 1; i3++)
                        {
                            arka[i0, i1, i2, i3] = 1;
                            Console.Write(arka[i0, i1, i2, i3]);
                        } 
                    }    
                }  
           }

Поскольку это такой же массив как двумерный, но с дополнительным измерением, то изменить его размер не составит труда. Возьмем метод для двумерного массива и внесем изменения:
1) Изменим тип массива
2) Добавим входные параметры
3) Изменить тело метода

public static void newResizeArray<T>(ref T[,,] arr, int columns, int rows,int dimension)
        {
            T[,,] newArray = new T[rows, columns,dimension];
            Array.Copy(arr, newArray, arr.Length);
            arr = newArray;
        }

На этом можно закончить с многомерными массивами.
Ступенчатый массив это массив массивов различной длины. Объявляется так:
тип [][] имя массива = new тип[размер] [];

int[][] arr = new int[4][];
            arr[0] = new int[4];
            arr[1] = new int[6];
            arr[2] = new int[3];
            arr[3] = new int[4];

Из такого объявления мы получили такой массив:

Обращаться к элементам такого массива можно так: arr[0][0]
Работа со ступенчатым массивом в цикле, немного иная чем с многомерными массивами. Для примера, код вывода ступенчатого массива:

for (int i = 0; i <= arr.GetLength(0)-1; i++)
            {
                for (int y = 0; y <= arr[i].Length-1; y++)
                {
                    Console.Write(arr[i][y]);
                }
           }

В первом цикле используется arr.GetLength(0) – таким образом мы получим колличество массивов. Во вложенном цикле используется arr[i].Length – для того чтобы узнать размер массива с индексом i. Так же можно использовать во вложенном цикле arr[i].GetLength(0). Существенной разницы в этом нету.
Для изменения таких массивов, нужно взять предыдущий метод и исправить его немного.
1) Изменить тип массива.
2) Изменить количество входных параметров.
3) Поправить код в теле метода.

public static void newResizeArray<T>(ref T[][] arr, int numA)
        {
            T[][] newArray = new T[numA][];
            Array.Copy(arr, newArray, arr.Length);
            arr = newArray;
        }

Но после использования такого метода нужно будет инициализировать ново созданные массивы. Иначе будет ошибка работы с массивом.
В ступенчатых массивах можно использовать многомерные массивы.
Пример использования:

int[][,,,] arr = new int[5][,,,];

На этом пожалуй все.

Спасибо за внимание, надеюсь это будет полезно.

Автор: meta13

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js