Изрезанные многомерные массивы.
В таких массивах строки могут иметь различную длину.
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() — возвращает верхние индексы.