Преборазование массивов

Изрезанные многомерные массивы.

В таких массивах строки могут иметь различную длину.

array<array<int>^>^ ar3 = gcnew array<array<int>^>(4);

В конструкторе в этом случае указывается только число строк двумерного массива. В этом случае определяется только ссылка на массив строк. Память под сами строки выделяются дополнительно.

for(int i=0; i<ar3->Length;i++)

{

ar3[i] = gcnew array<int>(i+1);

for(int j=1;j<=i+1;j++)

ar3[i][j-1]=j;

}

Лекция №12 (24.11.10)

Массивы языка C#

В C# массивы полностью динамические. То есть память под них выделяется в управляемой куче.

<тип>[] <объвители>

Таким образомосновное отличае в синтаксисе — квадратные скобки приписываются к типу, а не к имени массива. Границы изменения индексов и число элементов является характеристиками не класса, а экземпляров объектов класса, поэтому они указываются при создании объектов класса. Особенностью языка C# является то, что нижнюю границу индексов массива можно задавать производно.

int[] m1 = new int[5];

int[] m2 = { 1, 2, 3 };

m1 = m2;

В последнем случае размерность массива вычисляется по числу идентификаторв. Оператор NEW не используется, но массив по прежнему создается в динамической памяти. По-сколку массивы являются ссылками, то возможно присваивание. Старая память под массив m1 освобождается сборщиком мусора.

int[] matr ={ { 1, 2 }, { 3, 4, 5 } };

int [,] m5 - new int[3,5];

m5[i,j]=5;

Изрезанные массивы (массивы массивов)

int[][] jagger = new int[3]

{

new int[]{4,5,6,7};

new int[]{8,9};

new int[]{1};

}

Число строк можно не указывать, но конструкторы нижнего уровня должны быть обязательно. В C# все массивы можно рассматривать как коллекции и следовательно можно получить последовательный доступ ко всем элементам массива без использоавния индексов. В этом случае применяется цикл foreach

foreach(int item in jagger);

Для массивов возможно неявное преобразование. Для преобразования массива с элементами класса S к массиву с элементами класса T необходимо выполнения трех условий:

1) Классы S и T должны быть ссылочного типа.

2) Размерность массива должна совпадать.

3) Должно существовать неявное преобразование класса S в класс T

В .NET не допускается приведение к другому типу для массивов с элементами размерного типа. Однако нужный результат можно достичь используя статический метод класса Array с названием Copy - Array.Copy. Этот метод создает новый массив и при этом может преобразовывать элементы массива при копировании. Кроме того этот метод позволяет выполнять упаковку и распаковку элементов. Метод Copy выполняет ограниченное копирование. Т. е. Если в качестве элементов используются объекты ссылочного типа, то копируются только ссылки, а не реальные объекты. Массивы можно создавать динамически с помощью статического метода

Array.CreateInstance

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

Int32[] lowerBounds ={1995, 1};

Int32[] lengths = {10,4};

Decimal [,] d = (Decimal[,]) Array.CreateInstance(typeof(Decimal), lengths, lowerBounds);

Все массивы реализуются как производные базового класса Array и соответсвенно могут использовать все его методы.

Array.Length - количество элементов во всех размерностях.

Array.Rank - число размерностей массива.

Array.Search() - метод бинарного поиска.

Array.Clear() - обнуляет элементы массива.

Array.Indefof() - возвращает индекс первого вхождения элемента.

Array.LastIndexOf() - возвращает последний индекс вхождения элемента.

Array.Reverse() - меняет порядок элементов на обратный.

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

Array.GetLength() - возвращает число элементов указанной размерности.

Array.GetLowerth() - возвращает нижнние индексы.

Array.GetUpperBound() — возвращает верхние индексы.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: