Колекції

Масиви - це зручний засіб організації зберігання і впорядковування інформації. Проте при роботі з масивами практично завжди виникають завдання, які пов'язані з обробкою даних, що містяться в них. У сучасному програмуванні дуже часто елементами масиву є об'єкти, над якими необхідно виконувати різні дії. Через особливості колекцій, а також враховуючи той факт, що упор при викладі даного матеріалу був зроблений на використання колекцій для зберігання саме об'єктів, розділ, присвячений колекціям, розташований після розділу, присвяченого класам і структурам.

Раніше був розглянутий клас Array, в якому реалізований цілий набір часто використовуваних операцій над елементами масиву, таких як сортування, клонування, перерахування і розстановка елементів в зворотному порядку. Проте при роботі з масивами виникає і цілий ряд інших завдань. Вирішенням цих завдань і займаються колекції, що дозволяють організовувати елементи спеціальним чином і проводити згодом над ними певний набір операцій.

Всі визначені в.NET Framework колекції розташовані в просторі імен System.Collections. Найбільш часто використовувані колекції цього простору імен представлені нижчим.

ArrayList Масив об'єктів, що динамічно змінює свій розмір.
Hashtable Набір взаємозв'язаних ключів і значень, заснованих на хэш-коде ключа.
Queue Стандартна черга, реалізована за принципом "першим увійшов, першим вийшов" (FIFO – First In First Out).
SortedList Представляє клас, елементами якого можуть бути пари "ключ-значення", відсортовані за значенням ключа і що надають доступ до елементів по їх порядковому номеру (індексу).
Stack Черга, реалізована за принципом "останнім увійшов, першим вийшов" (LIFO – Last In First Out).

У просторі імен System.Collections.Specialized розташовані класи, призначені для використання в спеціальних випадках. Так, клас StringCollection представляє набір рядків. Класом StringDictionary є набір строкових значень, що складаються з пар "ключ-значення", як значення яких використовується рядок.

У даній лекції будуть розглянуті загальні питання застосування колекцій. Для детальнішого вивчення їх особливостей і можливостей рекомендується ознайомитися з розділом "Інтерфейси", а також використовувати додаткову літературу і довідкову систему MSDN.

Розглянемо приклад застосування колекцій на прикладі класу ArrayList. Для цього скористаємося розглянутим раніше класом Client. Дуже часто виникає ситуація, при якій необхідно буває поміщати об'єкти в список або масив для їх подальшої обробки. Звичайно, при цьому може бути достатньо тих можливостей, які надають стандартні масиви C#, розглянуті раніше. Проте колекції, як вже було сказано, володіють ширшими можливостями і, отже, їх застосування переважне в порівнянні з масивами. Так, для обробки даних про клієнтів створимо клас Clients, призначений для зберігання списку клієнтів і його обробки. При цьому необхідно врахувати, що клас Clients повинен забезпечувати можливість додавання, видалення і нумерації елементів (клієнтів). Для реалізації цієї функціональності необхідно використовувати клас ArrayList як вкладеного в клас Clients. Таким чином, нам необхідно визначити в даному класі елемент, що дозволяє вести список клієнтів, а також реалізувати набір відкритих методів, які передаватимуть виклики на виконання різних дій внутрішньому класу, похідному від ArrayList. Приклад початкової коди класу Clients приведений нижче.

public class Clients{ private ArrayList ClientsList; public Clients() { ClientsList=new ArrayList(); } public int ClientsCount { get { return ClientsList.Count; } } public void AddClient(Client з) { ClientsList.Add(c); } public void RemoveClient(int ClientToRemove) { ClientsList.RemoveAt(ClientToRemove); } public Client GetClient(int CLIENTID) { return (Client) ClientsList[CLIENTID]; }}

Використання такого класу представляється дуже простим:

Clients cl=new Clients();cl.AddClient(new Client("Сидоров","9002",new DateTime(1980,12,21)));cl.AddClient(new Client("Петров","9004",new DateTime(1975,03,15)));

Тепер стає можливим звернення до будь-якого класу Client, поміщеного в колекцію Clients за допомогою методу GetClient:

Client MyClient = cl.GetClient(1);Response.Write(MyClient.name);

Результатом роботи цього фрагмента програми буде рядок "Петров".

Проте існує декілька незручностей від використання класу Clients в його нинішній реалізації. По-перше, звичнішим зверненням до елементу масиву або списку в мові C# є використання індексаторів, що позначаються у вигляді квадратних дужок. Для реалізації цієї можливості в класі Clients необхідно створити індексатор:

public Clients this[int pos]{ get { return ((Clients)ClientsList[pos]); } set { ClientsList[pos]= value; }}

Як видно, від звичайного методу індексатор відрізняється ім'ям (this), а також наявністю квадратних дужок, в яких указується параметр - номер витягуваного елементу. За допомогою індексатора стає можливим витягання елементу з колекції, а також запис елементу в колекцію під певним номером:

Response.Write(cl[1].name);cl[1].name = "Сидоров";Response.Write(cl[1].name);

Тепер можна організувати обробку елементів масиву в циклі. При роботі з колекціями досить зручною є можливість використання циклу foreach. Для реалізації такої функціональності при роботі з класом Clients необхідно використовувати метод GetEnumerator() інтерфейсу IEnumerator - задати спадкоємство класом Clients інтерфейсу IEnumerator і реалізувати метод, як показано нижче.

public class Clients:IEnumerable{ public IEnumerator GetEnumerator() { return ClientsList.GetEnumerator(); }}

Приклад застосування циклу foreach з використанням класу Clients показаний нижче.

foreach (Clients з in cl){ Response.Write("Імя="+c.name+" "); Response.Write("Паспорт="+c.passport+" "); Response.Write("Возраст=" + з.age); Response.Write("</br>"); }

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



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