Класс Array
Каждый создаваемый массив получает большую часть функциональности от класса System.Array. Общие члены этого класса позволяют работать с массивом с использованием полноценной объектной модели. Таким образом, методы и свойства, определенные в классе Array, можно использовать с любым массивом C#. Давайте разберем некоторые полезные особенности класса Array.
Создание массивов
Класс Array является абстрактным, поэтому создать массив с использованием какого-либо конструктора нельзя. Однако вместо применения синтаксиса C# для создания экземпляров массивов также возможно создавать их с помощью статического метода CreateInstance(). Это исключительно удобно, когда заранее неизвестен тип элементов массива, поскольку тип можно передать методу CreateInstance() в параметре как объект Type:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main( string [] args) { // Создаем массив типа string, длиной 5 Array myArr = Array.CreateInstance( typeof ( string ),5); // Инициализируем первые два поля массива myArr.SetValue( "Name" ,0); myArr.SetValue( "Age" ,1); // Считываем данные из массива string s = ( string )myArr.GetValue(1); Console.ReadLine(); } } } |
Обратите внимание, что для установки значений в массив служит метод SetValue(), а для их чтения — метод GetValue().
Копирование массивов
Поскольку массивы — это ссылочные типы, присваивание переменной типа массива другой переменной создает две переменных, ссылающихся на один и тот же массив. Для копирования массивов предусмотрена реализация массивами интерфейса ICloneable. Метод Clone(), определенный в этом интерфейсе, создает неглубокую копию массива. Если элементы массива относятся к типу значений, то все они копируются, если массив содержит элементы ссылочных типов, то сами эти элементы не копируются, а копируются лишь ссылки на них.
Вместо метода Clone() можно также применять метод Array.Сору(), тоже создающий поверхностную копию. Но между Clone() и Сору() есть одно важное отличие: Clone() создает новый массив, а Сору() требует наличия существующего массива той же размерности с достаточным количеством элементов.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main( string [] args) { string [] arr2 = new string [5]; // Создаем массив типа string, длиной 5 Array myArr = Array.CreateInstance( typeof ( string ),5); // Инициализируем первые три поля массива myArr.SetValue( "Name" ,0); myArr.SetValue( "Age" ,1); myArr.SetValue( "Adress" ,2); // Копируем массив с помощью метода Clone() string [] arr1 = ( string [])myArr.Clone(); foreach ( string s in arr1) Console.Write( "\t" +s); // Копируем с помощью метода Copy() Console.WriteLine(); Array.Copy(myArr, arr2, myArr.Length); foreach ( string s in arr2) Console.Write( "\t" +s); Console.ReadLine(); } } } |
Сортировка и поиск
В классе Array реализован алгоритм быстрой сортировки (Quicksort) элементов массива. Метод Sort() требует от элементов реализации интерфейса IComparable. Простые типы, такие как System.String и System.Int32, реализуют IComparable, так что можно сортировать элементы, относящиеся к этим типам.
C помощью разных вариантов метода Sort() можно отсортировать массив полностью или в заданных пределах либо отсортировать два массива, содержащих соответствующие пары "ключ-значение". После сортировки в массиве можно осуществить эффективный поиск, используя разные варианты метода BinarySearch().
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main( string [] args) { int [] myArr = { 4, 5, -183, 12, 34, 0, 2 ,-13 }; Console.WriteLine( "Исходный массив чисел: " ); foreach ( int x in myArr) Console.Write( "\t{0}" ,x); // Реализуем сортировку массива Console.WriteLine( "\n\nОтсортированный массив:" ); Array.Sort(myArr); foreach ( int x in myArr) Console.Write( "\t{0}" ,x); // Организуем поиск числа 12 Console.WriteLine( "\n\nПоиск числа:" ); int search = Array.BinarySearch(myArr, 12); Console.WriteLine( "Число 12 находится на {0} позиции" ,search+1); Console.ReadLine(); } } } |

Комментарии