Приветствую всех. Сегодня я решил написать статью в которых будут рассмотрены примеры работы с массивами.
Объявления массива
Объявления массива происходит так же как и обычной переменной другого типа. Типы массивов могут быть как int, string, double, итд.
Объявляем массив:
1 |
int[] array; |
Инициализируем массив:
1 |
array = new int[3]; |
Обращение к массиву и присваивание значений по индексу:
1 2 3 |
array[0] = 1; array[1] = 2; array[2] = 3; |
Индекс в массиве всегда начинается с 0.
Рассмотрим и другие варианты инициализации массива:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
//Как и с другими типами, можно использовать var и совместить объявление и инициализацию var array1 = new int[3]; array1[0] = 1; array1[1] = 2; array1[2] = 3; //Можно записать так. Это тоже самое, что предыдущие 4 строки. var array2 = new int[] { 1, 2, 3 }; //Или даже так. Компилятор автоматически восстановит тип данных из типов констант 1, 2, 3. var array3 = new[] { 1, 2, 3 }; //Это касается, конечно, всех типов, не только числовых. var array4 = new[] { "a", "b", "c" }; //Здесь компилятор выдаст ошибку, поскольку он не может определить тип массива. //var array5 = new[] { 1, "2", 3 }; //Но это можно исправить, если указать тип явно. object - это прародитель всех типов. //Все есть object. var array6 = new object[] { 1, "2", 3 }; |
Важно!
Следующий пример выведет 0, поскольку массив чисел инициализирован нулями.
1 2 |
var intArray=new int[10]; Console.WriteLine(intArray[0].ToString()); |
Однако стоит помнить что в случаи инициализации строк в них значение будет null
1 2 |
var stringArray = new string[10]; Console.WriteLine(stringArray[0].ToString()); |
Почему так спросите вы? Есть некая фундаментальная разница между массивами и строками с одной стороны и числами — с другой.
Методы.
Массив имеет собственные методы, опишу часто используемые методы:
CopyTo(array,Int32); Копирует все элементы текущего одномерного массива в заданный одномерный массив начиная с указанного индекса в массиве назначения.
1 2 3 4 5 6 7 8 9 10 11 |
int[] a = new int[3]; a[0] = 1; a[1] = 2; a[2] = 3; int[] b; b= new int[6]; b[0] = 111; b[1] = 111; a.CopyTo(b,1); //111 1 2 3 0 0 |
Equal(); Определяет, равен ли заданный объект текущему объекту.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
int[] a = new int[3]; a[0] = 1; a[1] = 2; a[2] = 3; int[] b; b= new int[6]; b[0] = 111; b[1] = 111; a.CopyTo(b,1); if (a[0].Equals(b[1])) //true |
IndexOf(Array,Object); Выполняет поиск указанного объекта внутри всего одномерного массива и возвращает индекс его первого вхождения.
1 2 3 4 5 |
string[] str = { "Сайт", "на котором", "можно", "интересно", "провести", "время", "nookery" }; string searchString = "nookery"; int index = Array.IndexOf(str, searchString); string s = str[index]; //nookery |
Reverse(Array); Изменяет последовательность элементов в диапазоне элементов одномерного массива.
1 2 3 4 |
string[] str = { "Сайт", "на котором", "можно", "интересно", "провести", "время", "nookery" }; Array.Reverse(str); //nookery время провести интересно можно на котором Сайт |
Sort(Array); Сортирует элементы во всем одномерном массиве.
1 2 3 4 |
string[] str = { "Сайт", "на котором", "можно", "интересно", "провести", "время", "nookery" }; Array.Sort(str); //nookery время интересно можно на котором провести Сайт |
Как вывести содержимое массива:
Вариант с помощью for
1 2 3 4 5 |
var array = new[] { 1, 2, 3 }; //Элементы массива можно пробежать так for (int i = 0; i < array.Length; i++) Console.WriteLine(array[i]); |
Вариант с помощью foreach
1 2 |
foreach (var e in array) Console.WriteLine(e); |
Стоит не забывать, что использовать при работе с индексами массива, foreach не получиться, однако во всех других случаях используйте его, так как это поможет избавиться от множества ошибок, в первую очередь выход за границы массива при обращении к нему.
Стоит помнить что массив, как и строка, может быть равен null и соответственно, не инициализированные глобальные переменные типа массивов также равны null.
Передача массива в метод.
Теперь перейдем к одной из важных частей рассмотрения массива. О том как массив передается в метод и что с ним происходит.
Рассмотрим 3 метода с перегрузками, принимающие массив.
1 |
int[] b = new [] { 1, 2 }; |
Если установить в переданный массив новые значения в рамках метода,
1 2 |
public void someMethod(string[] cats) { cats = new string[] { "tiger", "lion", "leopard" }; } |
Если новые значения нужны и после выполнения метода, тогда надо пользоваться ключевым словом ref
:
1 2 |
public void someMethod(ref string[] cats) { cats = new string[] { "tiger", "lion", "leopard" }; } |
Если нужно просто вернуть новые значения, то так:
1 2 3 4 |
public string[] someMethod(string[] cats) { return new string [] { "tiger", "lion", "leopard" }; } |
Главное не забывать что массивы работают по ссылочному принципу, и когда массив передается в метод, в методе он все равно ссылается на стек в памяти где храниться. И при изменении значения массива в методе someMethod , меняться значения в массиве из основного метода Main() в котором мы передавали его.
Двумерный массив.
Следующей частью статьи посвящу двумерному массиву.
Двумерный массив может иметь разные типы, как и одномерный.
Объявления и инициализация происходит следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// Объявляем двумерный массив int[,] arr = new int[5, 5]; Random rand = new Random(); // Инициализируем данный массив for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { arr[i, j] = rand.Next(1, 15); Console.Write("{0}\t", arr[i, j]); } Console.WriteLine(); } |
В данном примере заполняются в виде матрицы рандомными цифрами. В виде 5 колонок и 5 столбцов. По этому же принципу происходит и обращение к элементам массива.
Однако надо учитывать, что длина такого массива — это совокупное количество элементов, в нашем примере длинна будет равна массива 25.
Массив массивов.
В заключении познакомимся еще с одной вариацией массивов, так называемый массив массивов. Такая разновидность массивов, может иметь разные типы как и переменные.
В отличие от многомерного массива, индексация производится двумя парами скобок:
1 |
array[0][0] = 1; |
В отличие от многомерного массива, являющегося прямоугольником или параллелепипедом, в массиве массивов все хранимые массивы могут быть разной длины
1 |
array[1] = new int[10]; |
Могут быть массивы массивов массивов…
1 |
int[][][] array1=new int[2][][]; |
или массивы двумерных массивов
1 |
int[][,] array2=new int[2][,]; |
а также двумерные массивы массивов
1 |
int[,][] array3 = new int[2, 3][]; |
Стоит запомнить что если есть тип, то из него можно сделать массив, который тоже будет типом.
Теперь рассмотрим как можно получить данные с таких массивов:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
//с помощью foreach foreach(int[] row in array) { foreach(int array in row) { Console.Write($"{array} \t"); } Console.WriteLine(); } //с помощью for for (int i = 0; i<array.Length;i++) { for (int j =0; j<array[i].Length; j++) { Console.Write($"{array[i][j]} \t"); } Console.WriteLine(); } |