В C# имеется богатый набор способов объявления этих массивов и иногда путаешься, когда разные языки программирования мелькают перед глазами через промежутки времени, ведь нет же такого, чтобы современный программист работал только с одним языком, а разные языки — это разная философия и методология, хоть и есть одинаковые понятия, подходы и схожесть синтаксиса. Разработчики всегда ищут облегчение процесса и за все время существования C# таких облегчений накопилось столько, что один и тот же вариант можно сделать несколькими способами.
Вступление
Данная статься будет организована попунктно — сначала рассмотрим обобщенно про массивы, а далее перейдем к многомерностям. Данная статья не последняя, могут быть продолжения по схожим тематикам, а C# есть много механизмов, относящихся к структурам(structure), спискам(List), словарям(Dictionary), хэш-таблицы(хэш-таблицы), потокобезопасные коллекции(Concurrent), строго типизированные коллекции(Generic), коллекциям объектной модели(ObjectModel), специализированные коллекции(Specialized). Ну в общем, тема большая и без грамотного составления структуры обучения будет очень сложно все это понять.
Способы объявления и инициализации одномерных массивов в C#
Давайте сразу скажем, что в C# имеются 5 способов объявления и инициализации массивов:
- Инициализировать при объявлении без спецификация ранга. При данном подходе индекс во второй части опускается и он берется автоматом при подсчете значений инициализации:
int[] myArray = new int[] { 1, 3, 5, 7, 9};
- Инициализация без указания повтора типа переменных после равенства. При данном походе размер массива также, как и в первом случае, рассчитывается автоматом, исходя из количества значений, участвующих в инициализации переменных внутри массива:
string[] myArray = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
- Можно объявить переменную массива без инициализации, но при присвоении массива этой переменной нужно использовать оператор new:
int[] myArray; myArray = new int[] { 1, 3, 5, 7, 9 };
- В C# массивом может быть не только любой базовый тип, но и класс. В понимании C# типом считается и класс, в том числе:
class MyType{ public string mField; } MyType[] myArray = new MyType[10]; MyType myTypeVar0 = new MyType(); myTypeVar0.mField = "Text 0"; MyType myTypeVar1 = new MyType(); myTypeVar1.mField = "Text 1"; ... myArray[0]=myTypeVar0; myArray[1]=myTypeVar1; ...
- В C# массив может принимать любой тип данных, если при инициализации указать тип object. Данный тип является родоначальником всех типов и поэтому может принимать любой тип:
object[] myArray = new object[]{1, "text", 1.2, 'A'};
Способы объявления и инициализации многомерных массивов в C#
На самом деле, тут не будет какой-то новый подход инициализации многомерных массивов, потому что нет отличий от одномерных. Создавая многомерный массив мы должны понимать, что создаем те же одномерные массивы, но в комплексе одной переменной.
- Многомерный массив в C# может иметь много измерений до бесконечности, но больше 2-х на практике редко используются:
int[] myArray1 = new int[4];//Массив 1-го измерения int[,] myArray2 = new int[4, 5];//Массив 2-го измерения int[,,] myArray3 = new int[4, 5, 7];//Массив 3-го измерения int[,,,] myArray4 = new int[4, 5, 7, 9];//Массив 4-го измерения ...
- Массив можно инициализировать при объявлении, как показано в следующем примере:
int[,] myArray2 = new int[2, 2]{{1, 5}, {6, 8}};//Массив 2-го измерения
- Можно опустить указание размерности:
int[,] myArray2 = new int[ , ]{{1, 5}, {6, 8}};//Массив 2-го измерения
- Если нужно создать переменную массива без инициализации, то необходимо использовать оператор new:
int[,] myArray2; myArray2 = new int[ , ]{{1, 5}, {6, 8}};//Массив 2-го измерения
- Следующий пример присваивает значение конкретному элементу массива:
int[,] myArray2 = new int[2 , 2];//Массив 2-го измерения myArray2[1, 2] = 10;//Инициализируем отдельный элемент в массиве
Способы объявления и инициализации массивы массивов в C#
Массив массивов — это массив, элементы которого сами являются массивами. Элементы массива массивов могут иметь различные размеры и измерения. Массивы массивов иногда также называются «невыровненными массивами». В следующих примерах показано, как выполняется объявление, инициализация и доступ к массивам массивов.
- Ниже показано объявление одномерного массива, включающего три элемента, каждый из которых является одномерным массивом целых чисел:
int[][] myArray = new int[3][];
- Перед использованием jaggedArray его элементы нужно инициализировать. Сделать это можно следующим образом:
myArray[0] = new int[5]; myArray[1] = new int[4]; myArray[2] = new int[2];
- Для заполнения элементов массива значениями можно также использовать инициализаторы, при этом размер массива знать не требуется:
myArray[0] = new int[] { 1, 3, 5, 7, 9 }; myArray[1] = new int[] { 0, 2, 4, 6 }; myArray[2] = new int[] { 11, 22 };
- Также массив можно инициализировать путем объявления:
int[][] myArray = new int[][] { new int[] {1,3,5,7,9}, new int[] {0,2,4,6}, new int[] {11,22} };
- Также можно использовать сокращенную форму. Обратите внимание, что при инициализации элементов оператор new опускать нельзя, так как инициализации по умолчанию для этих элементов не существует:
int[][] myArray = { new int[] {1,3,5,7,9}, new int[] {0,2,4,6}, new int[] {11,22} };
- Разреженный массив является массивом массивов и поэтому его элементы являются ссылочными типами и инициализируются значением null:
myArray[0][1] = 77; myArray[2][1] = 88;
- Массивы массивов можно смешивать с многомерными массивами. Ниже показано объявление и инициализация одномерного массива массивов, состоящего из трех двумерных элементов различного размера:
int[][,] myArray = new int[3][,] { new int[,] { {1,3}, {5,7} }, new int[,] { {0,2}, {4,6}, {8,10} }, new int[,] { {11,22}, {99,88}, {0,9} } };
- Доступ к отдельным элементам выполняется как показано в примере ниже, где отображено значение элемента [1,0] первого массива (значение 5):
System.Console.Write("{0}", myArray[0][1, 0]);
- Метод Length возвращает число массивов, содержащихся в массиве массивов. Например, если объявить предыдущий массив, мы получим следующее:
System.Console.WriteLine(myArray.Length);