Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие NET.doc
Скачиваний:
26
Добавлен:
07.03.2016
Размер:
4.63 Mб
Скачать

13.2. Простір імен System.Collections

У просторі імен System.Collections визначені набори стандартних колекцій і інтерфейсів, які реалізовані в цих колекціях. У таблиці 13.2 приведені найбільш важливі інтерфейси.

Таблиця 13.2

Інтерфейси простору імен System.Collections

Інтерфейс

Призначення

ICollection

Визначає загальні характеристики (наприклад, розмір) для набору елементів

IComparer

Дозволяє порівнювати два об'єкти

IDictionary

Дозволяє представляти вміст об'єкту у вигляді пар “ім'я-значення”

IDictionaryEnumerator

Використовується для нумерації вмісту об'єкту, що підтримує інтерфейс IDictionary

Продовження таблиці 13.2

Інтерфейс

Призначення

IEnumerable

Повертає інтерфейс IEnumerator для вказаного об'єкту

IEnumerator

Зазвичай використовується для підтримки оператора foreach відносно об'єктів

IHashCodeProvider

Повертає хеш-код для реалізації типу із застосуванням вибраного користувачем алгоритму хешування

IList

Підтримує методи додавання, видалення і індексування елементів в списку об'єктів

У таблиці 13.3 перераховані основні колекції, визначені в просторі System. Collections.

Таблиця 13.3

Колекції простору імен System.Collections

Клас

Призначення

Найважливіші з реалізованих інтерфейсів

ArrayList

Масив, що динамічно змінює свій розмір

IList, ICollection, IEnumerable, ICloneabl

BitArray

Компактний масив для зберігання бітових значень

ICollection, IEnumerable, ICloneable

Hashtable

Хеш-таблиця

IDictionary, ICollection, IEnumerable, ICloneable

Queue

Черга

ICollection, ICloneable, IEnumerable

SortedList

Колекція, відсортована по ключах. Доступ до елементів - по ключу або по індексу

IDictionary, ICollection, IEnumerable, ICloneable

Stack

Стек

ICollection, IEnumerable

Простір імен System.Collections.Specialized включає спеціалізовані колекції, наприклад колекцію рядків StringCollection і хеш- таблицю із рядковими ключами StringDictionary.

Як приклад стандартної колекції розглянемо клас ArrayList.

13.3. Клас ArrayList

Основним недоліком звичайних масивів є те, що об'єм пам'яті, який потрібен для зберігання їх елементів, має бути виділений до початку роботи з масивом. Клас ArrayList дозволяє програмістові не піклуватися про виділення пам'яті і зберігати в одному і тому ж масиві елементи різних типів.

За умовчанням при створенні об'єкту типу ArrayList будується масив з 16 елементів типу object. Можна задати бажану кількість елементів в масиві, передавши його в конструктор або встановивши як значення властивості Capacity, наприклад:

ArrayList arrl = new ArrayList(); // створюється масив з 16 елементів

ArrayList arr2 = new ArrayList(1000); // створюється масив з 1000 елементів

ArrayList аrrЗ = new ArrayList();

arr3.Capacity = 1000; // кількість елементів задається

Основні методи і властивості класу Arraylist перераховані в таблиці 13.4.

Таблиця 13.4

Основні елементи класу Arraylist

Елемент

Вигляд

Опис

Capacity

Властивість

Ємність масиву (кількість елементів, які можуть зберігатися в масиві)

Count

Властивість

Фактична кількість елементів масиву

Item

Властивість

Отримати або встановити значення елементу по заданому індексу

Add

Метод

Додавання елементу в кінець масиву

AddRange

Метод

Додавання серії елементів в кінець масиву

BinarySearch

Метод

Двійковий пошук у відсортованому масиві або його частині

Clear

Метод

Видалення всіх елементів з масиву

Clone

Метод

Поверхневе копіювання елементів одного масиву в інший масив

CopyTo

Метод

Копіювання всіх або частини елементів масиву в одновимірний масив

GetRange

Метод

Набуття значень підмножини елементів масиву у вигляді об'єкту типу Arraylist

IndexOf

Метод

Пошук входження елементу (повертає індекс елементу або -1, якщо елемент не знайдений)

Insert

Метод

Вставка елементу в задану позицію (по заданому індексу)

InsertRange

Метод

Вставка групи елементів, починаючи із заданої позиції

LastIndexOf

Метод

Пошук останнього входження елементу в одновимірний масив

Remove

Метод

Видалення першого входження заданого елементу

RemoveAt

Метод

Видалення елементу з масиву по індексу

Продовження таблиці 13.4

Елемент

Вигляд

Опис

RemoveRange

Метод

Видалення групи елементів з масиву

Reverse

Метод

Зміна порядку проходження елементів на зворотний

SetRange

Метод

Установка значень елементів масиву в заданому діапазоні

Sort

Метод

Впорядковування елементів масиву або його частини

TrimToSize

Метод

Установка ємності масиву рівною фактичній кількості елементів

Клас ArrayList реалізований через клас Array, тобто містить закрите поле цього класу. Оскільки всі типи в С# є нащадками класу object, масив може містити елементи довільного типу. Навіть якщо в масиві зберігаються звичайні цілі числа, тобто елементи значущого типу, внутрішній клас є масивом посилань на екземпляри типу object, які є упакованим типом-значенням. Відповідно, при занесенні в масив виконується упаковка, а при витяганні - розпаковування елементу. Це не може не позначитися на швидкодії алгоритмів, які використовують ArrayList.

Якщо при додаванні елементу в масив виявляється, що фактичну кількість елементів масиву перевищує його ємність, вона автоматично подвоюється, тобто відбувається повторне виділення пам'яті і переписування туди всіх існуючих елементів.

Приклад занесення елементів в екземпляр класу ArrayList:

arrl.Add(123);

arrl.Add( -2 );

arrl.Add("Вася");

Доступ до елементу виконується по індексу, проте при цьому необхідно явним чином привести отримане посилання до цільового типу, наприклад:

int а = (int) arrl [0];

int b = (int) arrl [l];

string s = (string) arrl [2];

Спроба приведення до невідповідного типу зберігається в елементі, викликає генерацію виключення InvalidCastException.

Для підвищення надійності програм застосовується наступний прийом: екземпляр класу ArrayList оголошується закритим полем класу, в якому необхідно зберігати колекцію значень певного типу, а потім описуються методи роботи з цією колекцією, які делегують свої функції методам ArrayList. Цей спосіб ілюструється в лістингу 13.1, де створюється клас для зберігання об'єктів типу Monster і похідних від нього.

Лістинг 13.1. Колекція об'єктів

using System;

using System.Collections;

namespace ConsoleApplicationl

{

class Monster { ... }

class Daemon : Monster { ... }

class Stado : IEnumerable

{

private ArrayList list;

public Stado() { list = new ArrayList(); }

public void Add( Monster m ) { list.Add( m ) ; }

public void RemoveAt( int i ) {list.RemoveAt( i ); }

public void Clear() { list.Clear(); }

public IEnumerator GetEnumerator()

{ return list.GetEnumerator(); }

}

class Classl

{

static void Main()

{

Stado stado = new Stado();

stado.Add( new Monster( "Monia" ) );

stado.Add( new Monster( "Monk" ) );

stado.Add( new Daemon ( "Dimon", 3 ) );

stado.RemoveAt( 1 );

foreach ( Monster x in stado ) x. Passport();

}

}

}

Результат роботи програми:

Monster Monia health = 100 ammo = 100

Daemon Dimon health = 100 ammo = 100 brain = 3

Недоліком цього рішення є те, що для кожного методу стандартної колекції доводиться описувати метод-оболонку, що викликає стандартний метод. У С# з'явилися класи-прототипи (generics), що дозволяють вирішити цю проблему. Ми розглянемо їх в наступному розділі.