Все о массивах в C#

Приветствую всех. Сегодня я решил написать статью в которых будут рассмотрены примеры работы с массивами.

Объявления массива

Методы массива

Передача массива в методы

Двумерному массиву

Массив массивов

 

Объявления массива

Объявления массива происходит так же как и обычной переменной другого типа. Типы массивов могут быть как int, string, double, итд.

Объявляем массив:

int[] array;

Инициализируем массив:

array = new int[3];

Обращение к массиву и присваивание значений по индексу:

array[0] = 1;
array[1] = 2;
array[2] = 3;

Индекс в массиве всегда начинается с 0.

Рассмотрим и другие варианты инициализации массива:

       //Как и с другими типами, можно использовать 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, поскольку массив чисел инициализирован нулями.

    var intArray=new int[10];
    Console.WriteLine(intArray[0].ToString());

Однако стоит помнить что в случаи инициализации строк в них значение будет null

    var stringArray = new string[10];
    Console.WriteLine(stringArray[0].ToString());

 

Почему так спросите вы? Есть некая фундаментальная разница между массивами и строками с одной стороны и числами — с другой.

Методы.

Массив имеет собственные методы, опишу часто используемые методы:

CopyTo(array,Int32); Копирует все элементы текущего одномерного массива в заданный одномерный массив начиная с указанного индекса в массиве назначения.

       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(); Определяет, равен ли заданный объект текущему объекту.

	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); Выполняет поиск указанного объекта внутри всего одномерного массива и возвращает индекс его первого вхождения.

        string[] str = { "Сайт", "на котором", "можно", "интересно", "провести", "время", "nookery" };
	string searchString = "nookery";
	int index = Array.IndexOf(str, searchString);
	string s = str[index];
	//nookery

Reverse(Array); Изменяет последовательность элементов в диапазоне элементов одномерного массива.

        string[] str = { "Сайт", "на котором", "можно", "интересно", "провести", "время", "nookery" };
			
	Array.Reverse(str);
	//nookery время провести интересно можно на котором Сайт

Sort(Array); Сортирует элементы во всем одномерном массиве.

	string[] str = { "Сайт", "на котором", "можно", "интересно", "провести", "время", "nookery" };

	Array.Sort(str);
	//nookery время  интересно можно на котором  провести Сайт

 

Как вывести содержимое массива:

Вариант с помощью for

        var array = new[] { 1, 2, 3 };

	//Элементы массива можно пробежать так
	for (int i = 0; i < array.Length; i++)
	Console.WriteLine(array[i]);

Вариант с помощью foreach

        foreach (var e in array)
	Console.WriteLine(e);

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

Стоит помнить что массив, как и строка, может быть равен null и соответственно, не инициализированные глобальные переменные типа массивов также равны null.

Передача массива в метод.

Теперь перейдем к одной из важных частей рассмотрения массива. О том как массив передается в метод и что с ним происходит.

Рассмотрим 3 метода с перегрузками, принимающие массив.

int[] b = new [] { 1, 2 };

Если установить в переданный массив новые значения в рамках метода,

public void someMethod(string[] cats) {
   cats = new string[] { "tiger", "lion", "leopard" }; }

Если новые значения нужны и после выполнения метода, тогда надо пользоваться ключевым словом ref:

public void someMethod(ref string[] cats) {
   cats = new string[] { "tiger", "lion", "leopard" }; }

Если нужно просто вернуть новые значения, то так:

public string[] someMethod(string[] cats)
{ 
 return new string [] { "tiger", "lion", "leopard" }; 
}

Главное не забывать что массивы работают по ссылочному принципу, и когда массив передается в метод, в методе он все равно ссылается на стек в памяти где храниться. И при изменении значения массива в методе someMethod , меняться значения в массиве из основного метода Main()  в котором мы передавали его.

Двумерный массив.

Следующей частью статьи посвящу двумерному массиву.

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

Объявления и инициализация происходит следующим образом:

// Объявляем двумерный массив
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.

Массив массивов.

В заключении познакомимся еще с одной вариацией массивов, так называемый массив массивов. Такая разновидность массивов, может иметь разные типы как и переменные.

В отличие от многомерного массива, индексация производится двумя парами скобок:

 array[0][0] = 1;

В отличие от многомерного массива, являющегося прямоугольником или параллелепипедом, в массиве массивов все хранимые массивы могут быть разной длины

array[1] = new int[10];

Могут быть массивы массивов массивов…

int[][][] array1=new int[2][][];

или массивы двумерных массивов

int[][,] array2=new int[2][,];

а также двумерные массивы массивов

int[,][] array3 = new int[2, 3][];

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

Теперь рассмотрим как можно получить данные с таких массивов:

//с помощью 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();
}

 

Обновлено: 30.12.2017 — 21:38

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.