Лекція Класи-колекції План Абстрактні структури даних > Колекції. Простір імен System. Collections icon

Лекція Класи-колекції План Абстрактні структури даних > Колекції. Простір імен System. Collections




Скачати 209.29 Kb.
НазваЛекція Класи-колекції План Абстрактні структури даних > Колекції. Простір імен System. Collections
Дата25.12.2012
Розмір209.29 Kb.
ТипЛекція

Лекція 5. Класи-колекції


План

5.1. Абстрактні структури даних

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

5.2.1. Клас Stack (Стек)

5.2.2. Клас Queue (Черга)

5.2.3. Клас ArrayList (Динамічний масив)

5.3. Класи-прототипи (класи з родовими параметрами)

5.1. Абстрактні структури даних


Будь-яка програма призначена для обробки даних, від способу організації яких залежить її алгоритм. Для різних завдань необхідні різні способи зберігання і обробки даних, тому вибір структур даних повинен передувати створенню алгоритмів і ґрунтуватися на вимогах до функціональності і швидкодії програми. Найчастіше в програмах використовуються масив, список, стек, черга, бінарне дерево, хеш-таблиця, граф і множина.

Масив — це скінченна сукупність однотипних величин. Масив займає безперервну область пам'яті і надає прямий доступ до своїх елементів за індексом. Пам'ять під масив виділяється до початку роботи з ним і потім не змінюється. Нагадаємо, що в С# є одновимірні, прямокутні і зубчасті масиви.

У списку кожен елемент зв'язаний з наступним і, можливо, з попереднім. У першому випадку список називається однозв'язним, в другому — двозв'язним. Якщо останній елемент зв'язати покажчиком з першим, вийде кільцевий список. Кількість елементів в списку може змінюватися в процесі роботи програми.

Черга — окремий випадок однонаправленого списку, додавання елементів в який виконується в один кінець, а вибірка — з іншого кінця. Інші операції з чергою не визначені. При вибірці елемент виключається з черги. Говорять, що черга реалізує принцип обслуговування FIFO (First In — First Out, першим прийшов, — першим пішов).

^ Бінарне дерево — динамічна структура даних, що складається з вузлів, кожен з яких містить, окрім даних, не більше двох посилань на різні бінарні піддерева. На кожен вузол є рівно одне посилання. Початковий вузол називається коренем дерева.

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

Граф — це сукупність вузлів і ребер, що сполучають різні вузли. Багато реальних практичних задач можна описати в термінах графів, що робить їх структурою даних, яка часто використовується при написанні програм.

Множина — це невпорядкована сукупність елементів. Для множини визначені операції перевірки належності елементу множині, включення і виключення елементу, а також об'єднання, пересічення і віднімання множин.

Ці структури даних називаються абстрактними, оскільки в них не задається реалізація допустимих операцій.

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

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

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


У С# під колекцією розуміється деяка група об'єктів. Колекції спрощують реалізацію багатьох завдань програмування, пропонуючи вже готові рішення для побудови структур даних. Всі колекції розроблені на основі певних інтерфейсів, тому стандартизують спосіб обробки групи об'єктів. Середовище .NET Framework підтримує три основні типи колекцій: загального призначення, спеціалізовані і орієнтовані на побітову організацію даних.

У просторі імен System.Collections визначені набори стандартних колекцій і інтерфейсів, які реалізовані в цих колекціях. У таблиці 5.1 наведені найбільш важливі інтерфейси. Інтерфейси IComparer, IEnumerable, IEnumerator ми розглядали в лекції 4.

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

^ Таблиця 5.1. Інтерфейси простору імен System.Collections

Інтерфейс

Призначення

ICollection

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

IComparer

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

IDictionary

Дозволяє представляти вміст об'єкту у вигляді пар "ім'я-значення" (хеш-таблиці)

IDictionaryEnumerator

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

IEnumerable

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

IEnumerator

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

IHashCodeProvider


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

Ilist

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


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


^ Таблиця 5.2. Класи колекцій загального призначення (з простору імен System.Collections)

Клас

Призначення

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

ArrayList

Динамічний масив

IList, ICollection, IEnumerable, ICloneable

BitArray

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

ICollection, IEnumerable, ICloneable

Hashtable

Хеш-таблиця

IDictionary, ICollection, IEnumerable, ICloneable

Queue

Черга

ICollection, ICloneable, IEnumerable

SortedList

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

IDictionary, ICollection, IEnumerable, ICloneable

Stack

Стек

ICollection, IEnumerable


Розглянемо деякі з цих класів.
^

5.2.1. Клас Stack


Стек — окремий випадок однонаправленого списку, додавання елементів в який і вибірка з якого виконуються з одного кінця, який називається вершиною стека (головою – head). Інші операції із стеком не визначені. При вибірці елемент виключається із стека. Говорять, що стек реалізує принцип обслуговування LIFO (Last In — First Out, останнім прийшов, — першим пішов).

У С# реалізацію стеку представляє клас Stack, який реалізує інтерфейси ICollection, IEnumerable і ICloneable. Stack - це динамічна колекція, розмір якої змінюється.

У класі Stack визначені наступні конструктори:

public Stack(); //створює порожній стек, початкова кількість елементів якого дорівнює 10

public Stack(int capacity); //створює порожній стек, початкова кількість елементів якого дорівнює capacity

public Stack(ICollection c); //створює стeк, який містить елементи колекції, заданої параметром c, початкова кількість елементів якого дорівнює 10.

Окрім методів, визначених в інтерфейсах, що реалізуються класом Stack, в цьому класі визначені власні методи


^ Таблиця 5.3. Методи класу Stack

Метод

Опис

public virtual bool Contains(object v)

Повертає значення true, якщо об'єкт v міститься у визиваючому стеку, інакше повертає значення false.

public virtual void Clear()

Встановлює властивість Сount рівній нулю, тим самим очищаючи стек.

public virtual object Peek()

Повертає елемент, розташований у вершині стека, але не витягуючи його із стека

public virtual object Рор()

Повертає елемент, розташований у вершині стека, і витягує його із стека

public virtual void Push(object v)


Поміщає об'єкт v у стек


public virtual object[] ToArray()

Повертає масив, який містить копії елементів викликаючого стека

Розглянемо декілька прикладів використання стека.

Приклад 5.1. Для заданого значення n запишемо в стек всі числа від 1 до n, а потім будемо вибирати їх із стека:

using System;

using System.Collections;

using System.Linq;

using System.Text;


namespace Lab12_1

{

class Program

{

static void Main(string[] args)

{

Console.Write("n= ");

int n = int.Parse(Console.ReadLine());

Stack intStack = new Stack();

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

intStack.Push(i);

Console.WriteLine("Розмірність стека " + intStack.Count);


Console.WriteLine("Верхній елемент стека = " + intStack.Peek());

Console.WriteLine("Розмірність стека " + intStack.Count);


Console.Write("Вміст стека = ");

while (intStack.Count != 0)

Console.Write("{0} ", intStack.Pop());

Console.WriteLine("\nНова розмірність стека " + intStack.Count);

Console.ReadKey();

}

}

}

Приклад 5.2. У текстовому файлі міститься математичний вираз. Необхідно перевірити баланс круглих дужок у виразі.

using System;

using System.Collections;

using System.Linq;

using System.Text;

using System.IO;


namespace Lab12_2

{

class Program

{

static void Main(string[] args)

{

StreamReader fileIn=new StreamReader("t.txt");

string line=fileIn.ReadToEnd();

fileIn.Close();

Stack skobki=new Stack();

bool flag=true;

//перевіряємо баланс дужок

for ( int i=0; i
{

//якщо поточний символ дужка, що відкривається, то поміщаємо її в стек

if (line[i]== '(') skobki.Push(i);

else if (line[i]== ')') //если поточний символ дужка, що закривається, то

{

//якщо стек порожній, то для закриваючої дужки не вистачає парної відкриваючої

if (skobki.Count == 0)

{ flag = false; Console.WriteLine("Можливо в позиції " + i + "зайва ) дужка"); }

else skobki.Pop(); //иначе витягуємо парну дужку

}

}

//якщо після перегляду рядка стек виявився порожнім, то дужки збалансовані

if (skobki.Count == 0) { if (flag) Console.WriteLine("дужки збалансовані"); }

else //инакше баланс дужок порушений

{

Console.Write("Можливо зайва ( дужка в позиції:");

while (skobki.Count != 0)

{

Console.Write("{0} ", (int)skobki.Pop());

}

Console.WriteLine();

}

}

}

}

в файлі t.txt знаходиться вираз:

(1+2)-4*(a-3)/(2-7+6)
^

5.2.2. Клас Queue (Черга)


АТД черга - це окремий випадок однонаправленого списку, додавання елементів в який виконується в один кінець (хвіст), а вибірка робиться з іншого кінця (голови). Інші операції з чергою не визначені. При вибірці елемент виключається з черги. Говорять, що черга реалізує принцип обслуговування FIFO (fist in - fist out, першим прийшов, - першим вийшов).

У С# реалізацію АТД черга представляє клас ^ Queue [кью], який так як і стек реалізує інтерфейси ICollection, IEnumerable і ICloneable. Queue - це динамічна колекція, розмір якої змінюється. При необхідності збільшення місткості черги відбувається з коефіцієнтом зростання за умовчанням рівним 2.0.

У класі Queue визначені наступні конструктори:

public Queue(); //створює порожню чергу, початкова місткість якої дорівнює 32

public Queue (int capacity); // створює порожню чергу, початкова місткість якої рівна capacity

public Queue (int capacity, float n); //створює порожню чергу, початкова місткість якої рівна capacity, і коефіцієнт зростання встановлюється параметром n

public Queue (ICollection с); //створює чергу, яка містить елементи колекції, заданої параметром с, і аналогічною місткістю.

Окрім методів, визначених в інтерфейсах, що реалізуються класом Queue, в цьому класі визначені власні методи:

^ Таблиця 5.4. Методи класу Queue

Метод

Опис

public virtual bool Contains (object v)

Повертає значення true, якщо об'єкт v міститься в черзі, інакше повертає значення false

public virtual void clear ()

Встановлює властивість Count рівною нулю, тим самим очищуючи чергу

public virtual object Dequeue ()

Повертає об'єкт з початку черги, видаляючи його з черги

public virtual object Peek ()

Повертає об'єкт з початку черги, не видаляючи його з черги

public virtual void Enqueue(object v)

Додає об'єкт v в кінець черги

public virtual object [ ] ToArrау ()

Повертає масив, який містить копії елементів черги

public virtual void TrimToSizeO

Встановлює властивість Capacity рівною значенню властивості Count



Розглянемо декілька прикладів використання черги.

Приклад 5.3. Для заданого значення n запишемо в чергу всі числа від 1 до n, а потім будемо вибирати їх з черги:


using System;

using System.Collections;

using System.Linq;

using System.Text;

using System.IO;


namespace Lab12_3

{

class Program

{

static void Main(string[] args)

{

Console.Write("n= ");

int n = int.Parse(Console.ReadLine());

Queue intQ = new Queue();

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

intQ.Enqueue(i);

Console.WriteLine("Розмірність черги " + intQ.Count);


Console.WriteLine("Верхній елемент черги = " + intQ.Peek());

Console.WriteLine("Розмірність черги " + intQ.Count);


Console.Write("Вміст черги = ");

while (intQ.Count != 0)

Console.Write("{0} ", intQ.Dequeue());

Console.WriteLine("\nНова розмірність черги " + intQ.Count);

}

}

}


Приклад 5.4. У текстовому файлі записана інформація про людей (прізвище, ім'я, по батькові, вік, вага через пробіл). Вивести на екран спочатку інформацію про людей молодше 40 років, а потім інформацію про всіх інших.


using System;

using System.Collections;

using System.Linq;

using System.Text;

using System.IO;


namespace Lab12_4

{

public struct one //структура для зберігання даних про одну людину

{

public string f;

public string i;

public string про;

public int age;

public float massa;

}

class Program

{

static void Main(string[] args)

{

StreamReader fileIn = new StreamReader("t.txt", Encoding.GetEncoding(1251));

string line;

Queue people = new Queue();

one а;

Console.WriteLine("ВІК МЕНШЕ 40 РОКІВ");

while ((line = fileIn.ReadLine()) != null) //читаємо до кінця файлу

{

string[] temp = line.Split(' '); //розбиваємо рядок на складові елементи

//заповнюємо структуру

a.f = temp[0];

a.i = temp[1];

a.o = temp[2];

а.age = int.Parse(temp[3]);

а.massa = float.Parse(temp[4]);

// якщо вік менше 40 років, то виводимо дані на екран, інакше поміщаємо їх в чергу для тимчасового зберігання

if (а.age < 40)

Console.WriteLine(a.f + "\t" + a.i + "\t" + a.o + "\t" + a.age + "\t" + а.massa);

else people.Enqueue(a);

}

fileIn.Close();


Console.WriteLine("ВІК 40 РОКІВ І СТАРШЕ");

while (people.Count != 0) // вибираємо з черги дані

{

а = (one)people.Dequeue();

Console.WriteLine(a.f + "\t" + a.i + "\t" + a.o + "\t" + a.age + "\t" + а.massa);

}

Console.ReadKey();

}

}

}

^

5.2.3. Клас ArrayList


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

Клас ArrayList реалізує інтерфейси ICollection, IList, IEnumerable і ICloneable. У класі ArrayList визначені наступні конструктори:

public ArrayList() //створює порожній масив з максимальною ємкістю рівною 16 елементам, при поточній розмірності 0

public ArrayList(int capacity) // створює масив із заданою ємкістю capacity, при поточній розмірності 0

public ArrayList(ICollection с) // створює масив, який ініціалізується елементами колекції с

Крім методів, визначених в інтерфейсах, які реалізує клас ArrayList, в ньому визначені і власні методи:

^ Таблиця 5.5. Методи класу ArrayList

Метод

Опис

public virtual void AddRange (ICollection с)

Додає елементи з колекції с в кінець визиваючої колекції

public virtual int BinarySearch (object v)


У визиваючій відсортованій колекції виконує пошук значення, заданого параметром v. Повертає індекс знайденого елементу. Якщо потрібне значення не знайдене, повертає від'ємне значення.

public virtual int BinarySearch (object v, IComparer comp)


У визиваючій відсортованій колекції виконує пошук значення, яке задане параметром v, на основі методу порівняння об'єктів, заданого параметром соmp. Повертає індекс знайденого елементу. Якщо потрібне значення не знайденен, повертає від'ємне значення.

public virtual int BinarySearch (int startldx, int count, object v, IComparer comp)


В визиваючій відсортованій колекції виконує пошук значення, заданого параметром v, на основі методу порівняння об'єктів, заданого параметром comp. Пошук починається з елементу, індекс якого дорівнює значенню startIdx, і включає count елементів. Метод повертає індекс знайденого елементу. Якщо потрібне значення не знайдене, повертає від'ємне значення.

public virtual void CopyTo(Array ar, int startIdx)

Копіює вміст визиваючої колекції, починаючи з елементу, індекс якого дорівнює значенню startIdx, в масив, заданий параметром аr. Масив має бути одновимірним і сумісним за типом з елементами колекції.

public virtual void CopyTo(int srcldx, Array ar, int destIdx, int count)


Копіює count елементів визиваючої колекції, починаючи з елементу, індекс якого дорівнює значенню srcIdx, в масив, заданий параметром аr, починаючи з елементу, індекс якого дорівнює значенню destIdx. Масив має бути одновимірним і сумісним за типом з елементами колекції

public virtual ArrayList GetRange(int idx, int count)


Повертає частину визиваючої колекції типа ArrayList. Діапазон колекції, яка повертається, починається з індексу idx і включає count елементів. Об'єкт, що повертається, посилається на ті ж елементи, що і визиваючий об'єкт

public static ArrayList FixedSize(ArrayList ar)


Перетворює колекцію ar на ArrayList-масив з фіксованим розміром і повертає результат

public virtual void InsertRange(int startldx, ICollection c)

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

public virtual int LastlndexOf(object v)

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

public static ArrayList Readonly(ArrayList ar)

Перетворює колекцію ar на ArrayList-масив, призначений лише для читання

public virtual void RemoveRange(int idx, int count)

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

public virtual void Reverse()

Розташовує елементи колекції в зворотному порядку

public virtual void Reverse(int startldx, int count)

Розташовує в зворотному порядку count елементів колекції, починаючи з індексу startldx

public virtual void SetRange(int startldx, ICollection c)

Замінює елементи колекції, починаючи з індексу startldx, елементами колекції, заданої параметром с

public virtual void Sort()

Сортує колекцію в порядку збільшення елементів

public virtual void Sort(IComparer comp)

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

public virtual void Sort ( int startidx, int endidx, icomparer comp)

Сортує частину колекції на основі методу порівняння об'єктів, заданого параметром comp. Сортування починається з індексу startidx і закінчується індексом endidx. Якщо параметр comp має нульове значення, для кожного об'єкту використовується стандартний метод порівняння

public virtual object [ ] ToArray ()

Повертає масив, який містить копії елементів визиваючого об'єкту

public virtual Array ToArray (Type type)

Повертає масив, який містить копії елементів об'єкту. Тип елементів в цьому масиві задається параметром type

public virtual void TrimToSize()

Встановлює властивість Capacity рівним значенню властивості Count


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

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

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

ArrayList arr3 = new ArrayList();

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

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

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

arr1.Add( 123 ); arr1.Add( -2 ); arr1.Add( "Вася" );

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

int а = (int) arr1[0];

int b = (int) arr1[1];

string s = (string) arr1[2];

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

Розглянемо приклад використання класу ArrayList.


using System;

using System.Collections;


namespace Lab_5

{

class Program

{

static void ArrayPrint(string s, ArrayList a)

{

Console.WriteLine(s);

foreach (int i in a)

Console.Write(i + " ");

Console.WriteLine();

}


static void Main(string[] args)

{

ArrayList myArray = new ArrayList();

Console.WriteLine("Початкова ємкість масиву: " + myArray.Capacity);

Console.WriteLine("Початкова кількість елементів: " + myArray.Count);


Console.WriteLine("\nДобавили 5 цифр");

for (int i = 0; i < 5; i++) myArray.Add(i);

Console.WriteLine("Поточна ємність масиву: " + myArray.Capacity);

Console.WriteLine("Поточна кількість елементів: " + myArray.Count);

ArrayPrint("Вміст масиву", myArray);


Console.WriteLine("\nОптимізуємо ємність масиву");

myArray.Capacity = myArray.Count;

Console.WriteLine("Поточна ємність масиву: " + myArray.Capacity);

Console.WriteLine("Поточна кількість елементів: " + myArray.Count);

ArrayPrint("Вміст масиву", myArray);


Console.WriteLine("\nДодаємо елементи в масив");

myArray.Add(10);

myArray.Insert(1, 0);

myArray.AddRange(myArray);

Console.WriteLine("Поточна ємність масиву: " + myArray.Capacity);

Console.WriteLine("Поточна кількість елементів: " + myArray.Count);

ArrayPrint("Вміст масиву", myArray);


Console.WriteLine("\nВидаляємо елементи з масиву");

myArray.Remove(0);

myArray.RemoveAt(10);

Console.WriteLine("Поточна ємність масиву: " + myArray.Capacity);

Console.WriteLine("Поточна кількість елементів: " + myArray.Count);

ArrayPrint("Вміст масиву", myArray);


Console.WriteLine("\nВидаляємо весь масив");

myArray.Clear();

Console.WriteLine("Поточна ємність масиву: " + myArray.Capacity);

Console.WriteLine("Поточна кількість елементів: " + myArray.Count);

ArrayPrint("Вміст масиву", myArray);

Console.ReadKey();

}

}

}


^

5.3. Класи-прототипи (generics)


Класи-прототипи (generics)— це класи, що мають у якості параметрів типи даних. Найчастіше їх застосовують для зберігання даних, тобто як контейнерні класи, або колекції. У другу версію бібліотеки .NET додані параметризовані колекції для представлення основних структур даних — стека, черги, списку, словника тощо. Ці колекції, розташовані в просторі імен System.Collections.Generic, дублюють аналогічні колекції простору імен System.Collections.

Класи-прототипи називають також родовими або шаблонними, оскільки вони є зразками, за якими під час виконання програми будуються конкретні класи.

У таблиці 5.6 наведено відповідність між звичайними і параметризованими колекціями бібліотеки .NET (параметри, що визначають типи даних, які зберігаються в колекції, вказані в кутових дужках).

^ Таблиця 5.6. Параметризовані колекції

Клас-прототип (версія 2.0)

Звичайний клас

Comparer

Comparer

Dictionary

HashTable

LinkedList



List

ArrayList

Queue

Queue

SortedDictionary

SortedList

Stack

Stack


Як приклад розглянемо використання універсального "двійника" класу ArrayList — класу List — для зберігання колекції об'єктів класу Person, а також для зберігання цілих чисел.


Приклад 5.6

using System;

using System.Collections.Generic;

using System.Collections;

using System.Linq;

using System.Text;


namespace Lab12_6

{

public class Person

{

public string Name; //имя

public int Age; // возраст

public string Role; // роль

public string GetName() { return Name; }

public int GetAge() { return Age; }

public Person(string N, int A)

{

this.Name = N;

this.Age = A;

}

public void Passport()

{

Console.WriteLine("Name = {0} Age = {1}", Name, Age);

}

}


class Program

{


static void Main(string[] args)

{

List
pers = new List
();

pers.Add(new Person("Іванов",18));

pers.Add(new Person("Петров",20));

pers.Add(new Person("Морозов", 3));


foreach (Person x in pers) x.Passport();

List lint = new List();

lint.Add(5); lint.Add(1); lint.Add(3);

lint.Sort();

int а = lint[2];

Console.WriteLine(а);


foreach (int x in lint) Console.Write(x + " ");


Console.ReadLine();


}

}

}

У цьому прикладі створюється дві колекції. Перша (pers) містить елементи класу Person.

Колекція lint складається з цілих чисел, причому для роботи з ними не потрібні явні перетворення типу при отриманні елементу з колекції.


Висновки

В цій лекції ми розглянули основні класи-колекції С# і приклади роботи з ними. Колекції спрощують реалізацію багатьох завдань програмування, пропонуючи вже готові рішення для побудови структур даних. Всі колекції розроблені на основі певних інтерфейсів, тому стандартизують спосіб обробки групи об'єктів. Середовище .NET Framework підтримує три основні типи колекцій: загального призначення, спеціалізовані і орієнтовані на побітову організацію даних.

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

^

Питання і завдання для самостійної роботи студента


  1. Вивчіть по довідковій системі склад простору імен System.Collections.

  2. Вивчіть по довідковій системі властивості і методи класу ArrayList.

  3. Опишіть основні види абстрактних структур даних.

  4. Чи допускає структура "лінійний список" прямий доступ до своїх елементів?

  5. Чим стек відрізняється від черги?

  6. У яких завданнях використовується стек? Наведіть приклади.

  7. У чому перевага масиву перед іншими структурами даних?

  8. Які методи містить клас ArrayList?

  9. Чим клас ArrayList відрізняється від звичайних масивів? Коли краще застосовувати клас ArrayList?

  10. Лабораторна робота 4.

Схожі:

Лекція Класи-колекції План Абстрактні структури даних > Колекції. Простір імен System. Collections iconЛекція 12. Класи-колекції
Найчастіше в програмах використовуються масив, список, стек, черга, бінарне дерево, хеш-таблиця, граф І множина
Лекція Класи-колекції План Абстрактні структури даних > Колекції. Простір імен System. Collections iconЛабораторна робота №12 Класи-колекції C# Мета роботи: Вивчення використання в програмах вбудованих інтерфейсів Варіанти завдань для Лабораторної роботи №12
Зверніть увагу на реалізацію в C# базових абстрактних структур даних таких як стек, черга, бінарне дерево, тощо. В с# вони реалізовані...
Лекція Класи-колекції План Абстрактні структури даних > Колекції. Простір імен System. Collections iconТип модуля: обов'язковий Семестр: І, ІІ обсяг модуля
Сі; оператори, функції та директиви мови Сі. Принципи ооп; глобальні функції; перевантаження функції; об‘єкти та операції над ними;...
Лекція Класи-колекції План Абстрактні структури даних > Колекції. Простір імен System. Collections iconТип модуля: обов'язковий Семестр: І, ІІ обсяг модуля
Сі; оператори, функції та директиви мови Сі. Принципи ооп; глобальні функції; перевантаження функції; об‘єкти та операції над ними;...
Лекція Класи-колекції План Абстрактні структури даних > Колекції. Простір імен System. Collections iconНазва модуля: Основи програмування Код модуля
Прості типи даних, введення-виведення даних, операції та вирази, структури керування в програмі, структуровані типи даних – масиви,...
Лекція Класи-колекції План Абстрактні структури даних > Колекції. Простір імен System. Collections iconТема : Основні поняття бази даних. Типи даних, що зберігаються в базі даних. Проектування бази даних і створення структури бази даних. Введення і редагування даних
Мета. Ознайомити учнів з основними поняттями бази даних, з типами даних. Формувати навички створення та редагування структури бази...
Лекція Класи-колекції План Абстрактні структури даних > Колекції. Простір імен System. Collections iconФормат опису модуля
Еом графоподібних структур. Лінійні структури даних. Стеки, черги, деки. Масиви. Множини I кортежі. Зберігання множин І масивів....
Лекція Класи-колекції План Абстрактні структури даних > Колекції. Простір імен System. Collections iconТеми дипломних робіт магістрів
...
Лекція Класи-колекції План Абстрактні структури даних > Колекції. Простір імен System. Collections iconЛекція Робота з файлами
У мові C# немає операторів введення І виведення. Замість них для обміну із зовнішніми пристроями застосовуються стандартні об'єкти....
Лекція Класи-колекції План Абстрактні структури даних > Колекції. Простір імен System. Collections iconЛекція Вбудовані інтерфейси С# План
У попередній лекції ми говорили, що інтерфейс це повністю абстрактний клас, всі методи якого абстрактні (не містять реалізації)
Додайте кнопку на своєму сайті:
Документи


База даних захищена авторським правом ©zavantag.com 2000-2013
При копіюванні матеріалу обов'язкове зазначення активного посилання відкритою для індексації.
звернутися до адміністрації
Документи