.RU

Массивы как коллекции - Учебное пособие для студентов специальности 051312 по дисциплине «Высокоуровневые методы...


^ Массивы как коллекции

В ряде задач массивы C# целесообразно рассматривать как коллекции, не используя систему индексов для поиска элементов. Это, например, задачи, требующие однократного или многократного прохода по всему массиву - нахождение суммы элементов, нахождение максимального элемента, печать элементов. В таких задачах вместо циклов типа For по каждому измерению достаточно рассмотреть единый цикл For Each по всей коллекции. Эта возможность обеспечивается тем, что класс Array наследует интерфейс IEnumerable. Обратите внимание, этот интерфейс обеспечивает только возможность чтения элементов коллекции (массива), не допуская их изменения. Применим эту стратегию и построим еще одну версию процедуры печати. Эта версия будет самой короткой и самой универсальной, поскольку подходит для печати массива, независимо от его размерности и типа элементов. Вот ее код:

public void PrintCollection(string name, Array A)

{

Console.WriteLine(name);

foreach (object item in A)

Console.Write("\t {0}", item);

Console.WriteLine();

}//PrintCollection


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

К сожалению, ситуация с чтением и записью элементов массива не симметрична. Приведем вариант процедуры CreateCollection:

public void CreateCollection(Array A)

{

int i = 0;

foreach (object item in A)

//item = rnd.Next(1,10); //item read only

A.SetValue(rnd.Next(1, 10), i++);

}//CreateCollection

Отметим, эту процедуру сделать универсальной не удается, поскольку невозможно модифицировать элементы коллекции. Поэтому цикл For Each здесь ничего не дает, и разумнее использовать обычный цикл. Данная процедура не универсальна и позволяет создавать элементы только для одномерных массивов.

^ Сортировка и поиск. Статические методы класса Array

Статические методы класса Array позволяют решать самые разнообразные задачи:

  1. Copy - позволяет копировать весь массив или его часть в другой массив.

  2. IndexOf, LastIndexOf - определяют индексы первого и последнего вхождения образца в массив, возвращая -1, если такового вхождения не обнаружено.

  3. Reverse - выполняет обращение массива, переставляя элементы в обратном порядке.

  4. Sort - осуществляет сортировку массива.

  5. BinarySearch - определяет индекс первого вхождения образца в отсортированный массив, используя алгоритм двоичного поиска.

Все методы перегружены и имеют ряд модификаций. Большинство из этих методов применимо только к одномерным массивам. Приведем примеры различных операций, доступных при работе с массивами, благодаря наследованию от класса Array:

public void TestCollection()

{

//операции над массивами

int nc = 7;

int[] col1 = new int[nc], col2 = new int[nc];

double[] col3 = new double[nc];

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

Arrs.CreateCollection(col1);

Arrs.PrintCollection("col1", col1);

Arrs.CreateCollection(col2);

Arrs.PrintCollection("col2", col2);

Arrs.CreateCollection(col3);

Arrs.PrintCollection("col3", col3);

Arrs.CreateTwoDimAr(col4);

Arrs.PrintCollection("col4", col4);

//сортировка, поиск, копирование

// поиск элемента

int first = Array.IndexOf(col1, 2);

int last = Array.LastIndexOf(col1, 2);

if (first == -1)

Console.WriteLine("Нет вхождений 2 в массив col1");

else if (first == last)

Console.WriteLine("Одно вхождение 2 в массив col1");

else

Console.WriteLine("Несколько вхождений 2 в массив col1");

//first = Array.IndexOf(col4, 4);

//только одномерный массив

Array.Reverse(col1);

Console.WriteLine("Обращение массива col1:");

Arrs.PrintCollection("col1", col1);

//Копирование

Array.Copy(col1, col3, col1.Length);

Console.WriteLine(" Массив col3 после копирования массива col1:");

Arrs.PrintCollection("col3", col3);

Array.Copy(col1, 1, col2, 1, 2);

Console.WriteLine("копирование двух элементов col1 в col2:");

Arrs.PrintCollection("col1", col1);

Arrs.PrintCollection("col2", col2);

//быстрая сортировка Хоара

Array.Sort(col1);

Console.WriteLine("Отсортированный массив col1:");

Arrs.PrintCollection("col1", col1);

first = Array.BinarySearch(col1, 2);

Console.WriteLine("Индекс вхождения 2 в col1: {0}", first);

//Создание экземпляра (массива)

Array my2Dar = Array.CreateInstance(typeof (double), 2, 3);

Arrs.PrintCollection("my2Dar", my2Dar);

//клонирование

my2Dar = (Array) col4.Clone();

Console.WriteLine("Массив my2Dar после клонирования col4:");

Arrs.PrintCollection("my2Dar", my2Dar);

//копирование CopyTo

col1.CopyTo(col2, 0);

Console.WriteLine("Массив col2 после копирования col1:");

Arrs.PrintCollection("col2", col2);

}

В этой процедуре продемонстрированы вызовы различных статических методов класса Array. Для метода ^ Copy показан вызов двух реализаций этого метода, когда копируется весь массив и часть массива. Закомментированный оператор вызова метода IndexOf напоминает о невозможности использования методов поиска при работе с многомерными массивами. Приведем результаты вывода, порожденные этим кодом.


Рис. 28.  Результаты применения статических методов класса Array

Таблица 3. Свойства класса Array

Свойство

Родитель

Описание

IsFixedSize

Интерфейс IList

True, если массив статический

IsReadOnly

Интерфейс IList

Для всех массивов имеет значение false

IsSynchronized

Интерфейс ICollection

True или False, в зависимости от того, установлена ли синхронизация доступа для массива

SyncRoot

Интерфейс ICollection

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

Array myCol = new int[];

lock( myCol.SyncRoot ) {

foreach ( Object item in myCol )

{

// безопасная обработка массива }

Length




Число элементов массива

Rank




Размерность массива

Таблица 4. Статические методы класса Array

Метод

Описание

BinarySearch

Двоичный поиск. Описание и примеры даны в тексте

Clear

Выполняет начальную инициализацию элементов. В зависимости от типа элементов устанавливает значение 0 для арифметического типа, false - для логического типа, Null для ссылок, "" - для строк.

Copy

Копирование части или всего массива в другой массив. Описание и примеры даны в тексте

CreateInstance

Класс Array, в отличие от многих классов, может создавать свои экземпляры не только с помощью конструктора new, но и при вызове метода CreateInstance:

Array my2Dar = Array.CreateInstance(typeof(double), 2,2)

IndexOf

Индекс первого вхождения образца в массив. Описание и примеры даны в тексте

LastIndexOf

Индекс последнего вхождения образца в массив. Описание и примеры даны в тексте

Reverse

Обращение одномерного массива. Описание и примеры даны в тексте

Sort

Сортировка массива. Описание и примеры даны в тексте

lot--stranica-6.html
lot-1-1-naimenovanie-zakazchika-instrukciya-uchastnikam-razmesheniya-zakaza.html
lot-1-postavka-uchebnoj-literaturi-na-yazikah-korennih-malochislennih-postavka-uchebnoj-literaturi-na-yazikah-korennih.html
lot-1-sportivnoe-i-turisticheskoe-oborudovanie.html
lot-1025-i-otkritij-aukcion-2-razdel-i-soderzhanie-2-razdel-i-obshie-usloviya-provedeniya-aukciona-4-statya-obshie-svedeniya-4.html
lot-12-konservirovannie-i-gotovie-produkti-iz-myasa-myasnih-subproduktov-i-krovi-zhivotnih.html
  • spur.bystrickaya.ru/kompleks-disciplini-buhgalterskij-uchet-naimenovanie-dlya-specialnosti-5v050600-stranica-8.html
  • report.bystrickaya.ru/istoricheskoe-kraevedenie-uchebno-metodicheskij-kompleks-dlya-studentov.html
  • knowledge.bystrickaya.ru/o-proekte-gradostroitelnogo-kodeksa-goroda-moskvi.html
  • zanyatie.bystrickaya.ru/tema-12-cifrovie-formati-syomki-i-montazha-osnovi-montazha.html
  • studies.bystrickaya.ru/9-samoregulyaciya-i-ustojchivost-ekosistem-zadachi-issledovanie-roli-faktorov-ih-otdelnih-kompleksovsredi-obitaniya.html
  • notebook.bystrickaya.ru/k-chemu-nado-bit-gotovim-v-pomosh-neprofessionalu-5.html
  • essay.bystrickaya.ru/ekzamenacionnie-voprosi-po-speckursu-uchebno-metodicheskij-kompleks-po-discipline-ugolovno-processualnoe-dokazivanie.html
  • college.bystrickaya.ru/10-zoni-i-obekti-specialnogo-ispolzovaniya-perechen-tekstovih-i-graficheskih-materialov.html
  • bukva.bystrickaya.ru/stadii-soversheniya-prestupleniya-chast-4.html
  • predmet.bystrickaya.ru/reshenie-zasedaniya-kafedri-protokol-ot-2013-uchebno-metodicheskij-kompleks-modulya-filosofiya.html
  • literature.bystrickaya.ru/dair-byazi-gejdlyar-hvii-yasrin-i-jarisinda-izbrannie-trudi.html
  • testyi.bystrickaya.ru/53vedenie-trudovih-normativov-i-rascheti-potrebnosti-v-trudovih-resursah.html
  • crib.bystrickaya.ru/informacionnij-byulleten-administracii-sankt-peterburga-8-709-7-marta-2011-g-stranica-2.html
  • shpora.bystrickaya.ru/zelinskij-nikolaj-dmitrievich-chast-6.html
  • school.bystrickaya.ru/administrativno-pravovie-metodi.html
  • prepodavatel.bystrickaya.ru/teofillin-v-lechenii-hronicheskih-obstruktivnih-a-g-chuchalin-hronicheskie-obstruktivnie-bolezni-legkih.html
  • thesis.bystrickaya.ru/prilozhenie-a--uchebno-vospitatelnaya-rabota-pu-39-analiticheskij-otchet-po-praktike-16.html
  • lecture.bystrickaya.ru/553-model-privratnika-581-struktura-novosti-589-stranica-22.html
  • school.bystrickaya.ru/glava-1-fizicheskaya-harakteristika-efirnih-masel-nikolaevskij-v-v.html
  • control.bystrickaya.ru/bezopasnost-zhiznedeyatelnosti-gosudarstvennij-obrazovatelnij-standart-visshego-professionalnogo-obrazovaniya.html
  • turn.bystrickaya.ru/osobennosti-lesoustrojstva-v-sovremennom-rekonstruktivnom-periode-prof-m-m-orlov-ocherednie-voprosi-lesoustrojstva.html
  • portfolio.bystrickaya.ru/otchet-o-samoobsledovanii-fgou-spo-doneckij-gosudarstvennij-promishlenno-gumanitarnij-tehnikum-stranica-2.html
  • klass.bystrickaya.ru/522-rukovodyashie-dokumenti-rd-perechen-pravovih-aktov-soderzhashih-gosudarstvennie-normativnie-trebovaniya-ohrani-truda.html
  • holiday.bystrickaya.ru/oblastnaya-celevaya-programma-po-stabilizacii-situacii-na-rinke-truda-chelyabinskoj-oblasti-na-2010-god-stranica-13.html
  • composition.bystrickaya.ru/pbk-daily-moskva-n023-1122009-milacheva-tatyana-neobespechennij-milliard-anonsi-sobitij-na-sredu-11-fevralya-2009-g-3.html
  • studies.bystrickaya.ru/ezhekvartalnijotche-t-emitenta-emissionnih-cennih-bumag-za-i-kvartal-2003-g-stranica-25.html
  • literatura.bystrickaya.ru/sistema-ochistki-vozduha-pravovie-i-normativno-tehnicheskie-osnovi-obespecheniya-bzhd-2.html
  • obrazovanie.bystrickaya.ru/prikaz-410-ot-14-maya-2012g-ob-obuchenii-rukovoditelej-i-organizatorov-ppe.html
  • uchenik.bystrickaya.ru/kosmologicheskie-modeli-vselennoj.html
  • testyi.bystrickaya.ru/71-obshie-polozheniya-podgotovki-zakupochnoj-proceduri-polozhenie-o-zakupkah-tovarov-rabot-uslug-federalnogo-gosudarstvennogo.html
  • grade.bystrickaya.ru/na-urokah-literaturi-iz-opita-raboti.html
  • uchenik.bystrickaya.ru/gosudarstvo-i-grazhdanskoe-obshestvo-formi-nh-vzaimodejstviya.html
  • studies.bystrickaya.ru/est-li-v-rossii-municipalnaya-sobstvennost-na-zemlyu.html
  • prepodavatel.bystrickaya.ru/testiruem-muzu-oglavlenie-prezhde-vsego-otveti-na-voprosi-dlya-somnevayushihsya-2.html
  • institut.bystrickaya.ru/sut-uchenij-dzogchen-v-tibetskoj-tradicii-bon-stranica-6.html
  • © bystrickaya.ru
    Мобильный рефератник - для мобильных людей.