- •939 Сторінка в djvu 54 сторінка
- •Int Count { get; } bool IsReadOnly { get; }
- •Int Compare(т х, т у)
- •Int CompareTo(object obj)
- •Int CompareTo(т other)
- •Int Compare(object X, object y)
- •Int Compare(т х, т у)
- •Inv.Add(new Inventory("Викрутки", 8.29, 2)); inv.Add(new Inventory("Молотки", 3.50, 4)); inv.Add(new Inventory("Дриля", 19.88, 8));
- •Void Reset()
939 Сторінка в djvu 54 сторінка
повинне бути наведене до типу int [ ]. (Нагадаємо, що Array є базовим типом для всіх масивів у З К.) І нарешті, значення всіх елементів масиву підсумуються.
Клас Hashtable
Клас Hashtable призначений для створення колекції, у якій для зберігання її елементів служить хеш-таблиця. Як повинне бути відомо більшості читачів, інформація зберігається в хеш-таблиці за допомогою механізму, називаного хешированням. При хешированню для визначення унікального значення, називаного хеш- кодом, використається інформаційний уміст спеціального ключа. Отриманий у підсумку хеш-код служить як індекс, по якому в таблиці зберігаються шукані дані, що відповідають заданому ключу. Перетворення ключа в хеш-код виконується автоматично, і тому сам хеш-код взагалі недоступний користувачеві. Перевага хешировання полягає в тім, що воно забезпечує сталість часу виконання операцій пошуку, витяги й установки значень незалежно від величини масивів даних. У класі Hashtable реалізуються інтерфейси IDictionary, ICollection, IEnumerable, ISerializable, IDeserializationCallback і ICloneable.
У класі Hashtable визначено чимало конструкторів. Нижче наведені найбільше часто використовувані конструктори цього класу.
public Hashtable()
public Hashtable(IDictionary d)
public Hashtable(int capacity)
public Hashtable(int capacity,
float loadFactor)
У першій формі створюється створюваний за замовчуванням об'єкт класу Hashtable. У другій формі створюваний об'єкт типу Hashtable ініціалізується елементами з колекції d. У третій формі створюваний об'єкт типу Hashtable ініціалізується, з огляду на ємність колекції, що задає параметром capacitу. І в четвертій формі створюваний об'єкт типу Hashtable ініціалізується, з огляду на задану ємність capacity і коефіцієнт заповнення loadFactor. Коефіцієнт заповнення, іноді ще називаний коефіцієнтом завантаження, повинен перебувати в межах від ОД до 1,0. Він визначає ступінь заповнення хеш-таблиці до збільшення її розміру. Зокрема, таблиця розширюється, якщо кількість елементів виявляється більше ємності таблиці, помноженої на коефіцієнт заповнення. У тих конструкторах, які не приймають коефіцієнт заповнення як параметр, цей коефіцієнт за замовчуванням вибирається рівним 1,0.
У класі Hashtable визначається ряд власних методів, крім тих, що вже оголошено в інтерфейсах, які в ньому реалізуються. Деякі з найбільше часто використовуваних методів цього класу наведені в табл. 25.5. Зокрема, для того щоб визначити, чи втримується ключ у колекції типу Hashtable, викликається метод ContainsKey(). А для того щоб з'ясувати, чи зберігається в такій колекції конкретне значення, викликається метод ContainsValue(). Для перерахування вмісту колекції типу Hashtable служить метод GetEnumerator(), що повертає об'єкт типу IDictionaryEnumerator. Нагадаємо, що IDictionaryEnumerator - це перерахунок, використовуваний для перерахування вмісту колекції, у якій зберігаються пари "джерело-значення".
Таблиця 25.5. Найбільше часто використовувані методи, певні в класі Hashtable
Метод |
Опис |
public virtual bool ContainsKey(object key) |
Повертає логічне значення true, якщо визвати Hashtable, з ключем key а інакше - логічне значення false. |
public virtual bool ContainsKey(object key) |
Повертає логічне значення true, якщо в зухвалій колекції типу Hashtable утримується значення value, а інакше - логічне значення false |
public virtual IDictionaryEnumerator GetEnumerator ( ) |
Повертає для зухвалої колекції типу Hashtable перерахунок типу IDictionaryEnumerator |
public static Hashtable Synchronized(Hashtable table)
|
Повертає синхронізований варіант колекції типу Hashtable, переданої як параметр table |
У класі Hashtable доступні також відкриті властивості, певні в тих інтерфейсах, які в ньому реалізуються. Особлива роль належить двом властивостям, Keys і Values, оскільки з їхньою допомогою можна одержати ключі або значення з колекції типу Hashtable. Ці властивості визначаються в інтерфейсі IDictionary у такий спосіб.
public virtual ICollection Keys ( get; }
public virtual icollection Values { get; }
У класі Hashtable не підтримуються впорядковані колекції, і тому ключі або значення виходять із колекції в довільному порядку. Крім того, у класі Hashtable є захищена властивість EqualityComparer. А дві інших властивості, hep й comparer, уважаються застарілими.
Пари "значення-значення-джерело-значення" зберігаються в колекції типу Hashtable у формі структури типу DictionaryEntry, але найчастіше це робиться без прямого втручання з боку користувача, оскільки властивості й методи оперують ключами й значеннями окремо. Якщо, наприклад, у колекцію типу Hashtable додається елемент, то для цієї мети викликається метод Add ( ), що приймає два аргументи: ключ і значення.
Потрібно, однак, мати на увазі, що збереження порядку проходження елементів у колекції типу Hashtable не гарантується. Справа в тому, що процес хешированння виявляється, як правило, непридатним для створення відсортованих таблиць.
Нижче наведений приклад програми, у якій демонструється застосування класу Hashtable.
// Продемонструвати застосування класу Hashtable.
using System;
using System.Collections;
class HashtableDemo { static void Main() {
// Створити хеш-таблицу.
Hashtable ht = new Hashtable();
// Додати елементи в таблицю.
ht.Add("будинок", "житлове приміщення");
ht.Add("автомашина", "транспортний засіб");
ht.Add("книга", "набір друкованих слів");
ht.Add("яблуко", "їстівний плід");
// Додати елементи за допомогою індексатора, ht["трактор"] = "сільськогосподарська машина";
// Одержати колекцію ключів.
ICollection з = ht.Keys;
// Використати ключі для одержання значень, foreach(string str in с)
Console.WriteLine(str + ": " + ht[str]);
}
Виконання цієї програми приводить до наступного результату.
будинок: житлове приміщення книга:
набір друкованих слів трактор:
сільськогосподарська машина автомашина:
транспортний засіб яблуко:
їстівний плід
Як треба з наведеного вище результату, пари "значення-значення-джерело-значення" зберігаються в довільному порядку. Зверніть увагу на те, як отримане й відображений уміст хеш-таблицы ht. Спочатку була отримана колекція ключів за допомогою властивості Keys. Потім кожен ключ був використаний для індексування хеш-таблицы ht з метою витягти з її значення, що відповідає заданому ключу. Нагадаємо, що як індекс у цьому випадку використався індексатор, певний в інтерфейсі IDictionary і реалізований у класі Hashtable.
Клас SortedList
Клас SortedList призначений для створення колекції, у якій пари "ключ- значення" зберігаються в порядку, відсортованому за значенням ключів. У класі SortedList реалізуються інтерфейси IDictionary, ICollection, IEnumerable і ICloneable.
У класі SortedList визначено трохи конструкторів, включаючи наступні.
public SortedList()
public SortedList(IDictionary d)
public SortedList(int initialCapacity)
public SortedList(IComparer comparer)
У першому конструкторі створюється порожня колекція, первісна ємність якої дорівнює нулю. У другому конструкторі створюється порожня колекція типу SortedList, що ініціалізується елементами з колекції d. Її первісна ємність дорівнює кількості зазначених елементів. У третьому конструкторі створюється порожня колекція типу SortedList, первісний розмір якої визначає ємність, що задає параметром initialCapacity. Ця ємність відповідає розміру базового масиву, використовуваного для зберігання елементів колекції. І в четвертій формі конструктора за допомогою параметра comparer указується спосіб, використовуваний для порівняння об'єктів за списком. У цій формі створюється порожня колекція, первісна ємність якої дорівнює нулю.
При додаванні нових елементів у список ємність колекції типу SortedList збільшується автоматично в міру потреби. Так, якщо поточна ємність колекції перевищується, то вона відповідно збільшується. Перевага вказівки ємності колекції типу SortedList при її створенні полягає в зниженні або повнім виключенні витрат на зміну розміру колекції. Зрозуміло, указувати ємність колекції доцільно лише в тому випадку, якщо заздалегідь відомо, скільки елементів потрібно зберігати в ній.
У класі SortedList визначається ряд власних методів, крім тих, що вже оголошено в інтерфейсах, які в ньому реалізуються. Деякі з найбільше часто використовуваних методів цього класу перераховані в табл. 25.6. Так, якщо потрібно визначити, чи втримується ключ у колекції типу SortedList, викликається метод ContainsKey ( ). А якщо потрібно з'ясувати, чи зберігається конкретне значення в колекції типу SortedList, викликається метод ContainsValue ( ). Для перерахування вмісту колекції типу SortedList служить метод GetEnumerator ( ), що повертає об'єкт типу IDictionaryEnumerator. Нагадаємо, що IDictionaryEnumerator - це перечисельник, використовуваний для перерахування вмісту колекції, у якій зберігаються пари "значення-значення-джерело-значення". І нарешті, для одержання синхронізованої оболонки, у яку полягає колекція типу SortedList, викликається метод Synchronized ( ).
Таблиця 25.6. Найбільше часто використовувані методи, певні в класі SortedList
Метод |
Опис |
public virtual bool ContainsValue(object key) |
Повертає логічне значення true, якщо зухвалої колекції типу SortedList життя ключ key, а інше – логічне false |
public virtual bool ContainsValue(object value) |
Повертає логічне значення true, якщо в визиваючому типі SortedList має значення value, а інше – логічне значення false |
public virtual object GetBylndex(int index) |
Повертає значення, вказує по індексу index |
public virtual IDictionaryEnumerator GetEnumerator() |
Повертає для викликаючої колекції типа SortedList перерахунок типа IDictionaryEnumeratot |
public virtual object GetKey(int index) |
Повертає значення, що вказує по індексі index |
public virtual IList GetKeyList() |
Повертає колекцію типу SortedList із ключами, що зберігаються в зухвалій колекції типу SortedList
|
public virtual IList GetValueList() |
Повертає колекцію типу SortedList зі значеннями, що зберігаються в зухвалій колекції типу SortedList
|
public virtual int IndexOfKey(object key) |
Повертає індекс ключа key. Якщо шуканий ключ не виявлений, повертається значення -1
|
public virtual int IndexOfValue(object value) |
Повертає індекс першого входження значення value у зухвалій колекції. Якщо шукане значення не виявлене, повертається значення -1 |
public virtual void SetBylndex(int index, object value) |
Встановлює значення по індексі index рівним значенню value
|
public static SortedList Synchronized(SortedList list) |
Повертає синхронізований варіант колекції типу SortedList, переданої як параметр list
|
public virtual void TrimToSize() |
Встановлює значення властивості Capacity рівним значенню властивості Count |
Ключ або значення можна одержати різними способами. Зокрема, для одержання значення по зазначеному індексі служить метод GetBylndex ( ), а для установки значення по зазначеному індексі - метод SetBylndex ( ). Для витягу ключа по зазначеному індексі викликається метод GetKey ( ), а для одержання списку ключів по зазначеному індексі - метод GetKeyList ( ). Крім того, для одержання списку всіх значень із колекції служить метод GetValueList ( ). Для одержання індексу ключа викликається метод IndexOf Кеу ( ), а для одержання індексу значення - метод IndexOfValue ( ). Безумовно, у класі SortedList також підтримується індексатор, обумовлений в інтерфейсі IDictionary і що дозволяє встановлювати й одержувати значення по заданому ключі.
У класі SortedList доступні також відкриті властивості, певні в тих інтерфейсах, які в ньому реалізуються. Як й у класі Hashtable, у даному класі особлива роль належить двом властивостям, Keys і Values, оскільки з їхньою допомогою можна одержати доступну тільки для читання колекцію ключів або значень ізколекції типу SortedList. Ці властивості визначаються в інтерфейсі IDictionary у такий спосіб.
public virtual ICollection Keys { get; )
public virtual ICollection Values { get; }
Порядок проходження ключів і значень відбиває порядок їхнього розташування в колекції типу SortedList.
Аналогічно колекції типу Hashtable, пари "значення-значення-джерело-значення" зберігаються в колекції типу SortedList у формі структури типу DictionaryEntry, але, як правило, доступ до ключів і значень здійснюється окремо за допомогою методів і властивостей, певних у класі SortedList.
У наведеному нижче прикладі програми демонструється застосування класу SortedList. Це перероблений і розширений варіант попереднього приклада, що демонстрував застосування класу Hashtable, замість якого тепер використається клас SortedList. Дивлячись на результат виконання цієї програми, ви можете самі переконатися, що тепер список отриманих значень виявляється відсортованим по заданому ключі.
// Продемонструвати застосування класу SortedList.
using System;
using System.Collections;
class SLDemo { static void Main() {
// Створити відсортований список.
SortedList si = new SortedList();
// Додати елементи в список.
si.Add("будинок", "житлове приміщення");
si.Add("автомашина", "транспортний засіб");
si.Add("книга", "набір друкованих слів");
si.Add("яблуко", "їстівний плід");
// Додати елементи за допомогою індексатора, si["трактор"] = "сільськогосподарська машина";
// Одержати колекцію ключів.
ICollection з = si.Keys;
// Використати ключі для одержання значень.
Console.WriteLine("Уміст списку по індексаторі.");
fbreach(string str in с)
Console.WriteLine(str + ": " + si[str]);
Console.WriteLine() ;
// Відобразити список, використовуючи цілочисельні індекси.
Console.WriteLine("Уміст списку по цілочисельним індексах.");
for(int i=0; i < si.Count; i++)
Console.WriteLine(si.GetBylndex(i) ) ;
Console.WriteLine() ;
// Показати целочисленные індекси елементів списку.
Console.WriteLine("Целочисленные індекси елементів списку.");
foreach(string str in с)
Console.WriteLine(str + ": " + si.IndexOfKey(str));
)
)
Нижче наведений результат виконання цієї програми.
Уміст списку по індексаторі,
автомашина : транспортний засіб
будинок : житлове приміщення
книга: набір друкованих слів
трактор: сільськогосподарська машина
яблуко: їстівний плід
Уміст списку по цілочисельних індексах.
транспортний засіб
житлове приміщення
набір друкованих слів
сільськогосподарська машина
їстівний плід
Цілочисельні індекси елементів списку.
автомашина : ПРО
будинок : 1
книга : 2
трактор : 3
яблуко : 4
Клас Stack
Як повинне бути відомо більшості читачів, стек являє собою список, що діє за принципом "першим прийшов - останнім обслужений". Цей принцип дії стека можна наочно представити на прикладі гірки тарілок, що коштують на столі. Перша тарілка, поставлена в цю гірку, витягається з її останньої. Стік ставиться до одним з найважливіших структур даних в обчислювальній техніці. Він нерідко застосовується, серед іншого, у системному програмному забезпеченні, компіляторах, а також у програмах відстеження у зворотному порядку на основі штучного інтелекту
Клас колекції, що підтримує стік, зветься Stack. У ньому реалізуються інтерфейси ICollection, IEnumerable і ICloneable. Цей клас створює динамічну колекцію, що розширюється в міру потреби зберігати в ній уводять элементы, що. Щораз, коли потрібно розширити таку колекцію, її ємність збільшується вдвічі.
У класі Stack визначаються наступні конструктори.
public Stack ()
public Stack(int initialCapacity)
public Stack(ICollection col)
У першій формі конструктора створюється порожній стек, у другій формі — порожній стек, первісний розмір якого визначає первісна ємність, що задає параметром initialCapacity, і в третій формі — стек, що містить елементи вказує коллекции, що, col. Його первісна ємність дорівнює кількості зазначених елементів.
У класі Stack визначається ряд власних методів, крім тих, що вже оголошено в інтерфейсах, які в ньому реалізуються. Деякі з найбільше часто використовуваних методів цього класу наведені в табл. 25.7. Ці методи звичайно застосовуються в такий спосіб. Для того щоб помістити об'єкт на вершині стека, викликається метод Push (). А для того щоб витягти й видалити об'єкт із вершини стека, викликається метод Pop (). Якщо ж об'єкт потрібно тільки витягти, але не видалити з вершини стека, то викликається метод Рeek (). А якщо викликати метод Pop () або Peek (), коли зухвалий стік порожній, то згенерується виключення InvalidOperationException.
Таблиця 25.7. Найбільше часто використовувані методи, певні в класі Stack
Метод |
Опис |
public virtual void Clear() |
Встановлює властивість Count рівним нулю, очищаючи, власне кажучи, стек |
public virtual bool Contains(object obj) |
Повертає логічне значення true, якщо об'єкт obj утримується в зухвалій стеці, а інакше - логічне значення false |
public virtual object Peek() |
Повертає елемент, що перебуває на вершині стека, але не видаляє його |
public virtual object Pop () |
Повертає елемент, що перебуває на вершині стека, видаляючи його по ходу справи |
public virtual void Push (object obj) |
Поміщає об'єкт obj у стек |
public static Stack Synchronized(Stack stack) |
Повертає синхронізований варіант колекції типу Stack, переданої як параметр stack |
public virtual object[] ToArray() |
Повертає масив, що містить копії елементів стека |
У наведеному нижче прикладі програми створюється стек, у який міститься кілька цілих значень, а потім вони витягаються назад зі стека.
// Продемонструвати застосування класу Stack.
using System;
using System.Collections;
class StackDemo {
static void ShowPush(Stack st, int a) { st.Push (a);
Console.WriteLine("Помістити в стек: Push(" + a + ")");
Console.Write("Уміст стека: "); foreach(int i in st)
Console.Write(i + " ");
Console.WriteLine();
)
static void ShowPop(Stack st) {
Console.Write("Витягти зі стека: Pop -> "); int a = (int) st.Pop();
Console.WriteLine(а) ;
Console.Write("Уміст стека: "); foreach(int i in st)
Console.Write(i + " ");
Console.WriteLine();
static void Main() {
Stack st = new Stack ();
foreach(int i in st) Console.Write(i + " ");
Console.WriteLine();
ShowPush(st, 22); ShowPush(st, 65); ShowPush(st, 91);
ShowPop(st);
ShowPop (st);
ShowPop(st);
try {
ShowPop(st);
} catch (InvalidOperationException) Console.WriteLine("Стік порожній.");
}
)
Помістити в стек: Push(22)
Вміст стека: 22
Помістити в стек: Push(65)
Вміст стека: 65 22
Помістити в стек: Push(91)
Вміст стека: 91 65 22
Витягнути із стеку: Pop -> 91
Вміст стеку: 65 22
Витягнути із стеку: Pop -> 65
Вміст стеку: 22
Витягнути із стеку: Pop ->22
Вміст стеку:
Витягнути із стеку:Pop -> Стек пустий.
Клас Queue
Ще однієї распространейной структурою даних є черга, що діє за принципом: першим прийшов — першим обслужений. Це означає, що першим із черги витягається елемент, поміщений у неї першим. Черги часто зустрічаються в реальному житті. Багатьом з нас нерідко доводилося стояти в чергах до каси в банку, магазині або їдальні. У програмуванні черги застосовуються для зберігання таких елементів, як процеси, що виконуються в цей момент у системі, списки припинених транзакцій у базі даних або пакети даних, отримані по Інтернету. Крім того, черги нерідко застосовуються в області імітаційного моделювання.
Клас колекції, що підтримує чергу, зветься Queue. У ньому реалізуються інтерфейси ICollection, IEnumerable і ICloneable. Цей клас створює динамічну колекцію, що розширюється, якщо в ній необхідно зберігати вводять элементи. Так, якщо в черзі потрібне вільне місце, її розмір збільшується на коефіцієнт росту, що за замовчуванням дорівнює 2,0.
У класі Queue визначаються наведені нижче конструктори.
public Queue()
public Queue (int capacity)
public Queue (int capacity, float growFactor)
public Queue (ICollection col)
У першій формі конструктора створюється порожня черга з обираними за замовчуванням ємністю й коефіцієнтом росту 2,0. У другій формі створюється порожня черга, первісний розмір якої визначає ємність, що задає параметром capacity, а коефіцієнт росту за замовчуванням вибирається для неї рівним 2,0. У третій формі допускається вказувати не тільки ємність (як параметр capacity), але й коефіцієнт росту створюваної черги (як параметр growFactor у межах від 1,0 до 10,0). І в четвертій формі створюється черга, що складається з елементів указує коллекции, що, col. Її первісна ємність дорівнює кількості зазначених елементів, а коефіцієнт роста по замовчанню вибирається для неї рівним 2,0.
У класі Queue визначається ряд власних методів, крім тих, що вже оголошено в інтерфейсах, які в ньому реалізуються. Деякі з найбільше часто використовуваних методів цього класу перераховані в табл. 25.8. Ці методи звичайно застосовуються в такий спосіб. Для того щоб помістити об'єкт у чергу, викликається метод Enqueue ( ). Якщо потрібно витягти' і видалити перший об'єкт із початку черги, то викликається метод Dequeue ( ). Якщо ж потрібно витягти, але не видаляти наступний об'єкт із черги, то викликається метод Peek ( ). А якщо методи Dequeue ( ) і Peek ( ) викликаються, коли черга порожня, то генерується виключення InvalidOperationException.
Таблиця 25.8. Найбільше часто використовувані методи, певні в класі Queue Метод
Метод |
Опис |
public Virtual void С1еаг() |
Установлює властивість Count рівним нулю, очишуючи власне кажучи чергу |
public virtual bool Contains(object obj) |
Повертає логічне значення true, якщо об'єкт obj утримується в черзі, а інакше — логічне значення false |
public virtual object Dequeue() |
Повертає об'єкт із початку черги. Об'єкт, що повертає, видаляється із черги |
public virtual void Enqueue(object obj) |
Додає об'єкт obj у кінець черги |
public virtual object Peek() |
Повертає об'єкт із початку черги, але не видаляє його |
public static Queue Synchronized(Queue queue) |
Повертає синхронізований варіант колекції типу Queue, переданої як параметр queue |
public virtual object[] ToArray() |
Повертає масив, що містить копії елементів із черги |
public virtual void TrimToSize() |
Встановлює значення властивості Capacity рівним значенню властивості Count |
У наведеному нижче прикладі програми демонструється застосування класу Queue.
// Продемонструвати застосування класу Queue.
using System;
using System.Collections;
class QueueDemo {
static void ShowEnq(Queue q, int a) { q.Enqueue(a);
Console.WriteLine("Помістити в чергу: Enqueue(" + a + ")");
Console.Write("Уміст черги: "); foreach(int i in q)
Console.Write (i + " ");
Console.WriteLine ();
)
static void ShowDeq(Queue q) {
Console.Write("Витягти із черги: Dequeue -> "); int a = (int) q.Dequeued;
Console.WriteLine (a);
Console.Write("Уміст черги: "); foreach(int i in q)
Console.Write(i + " ");
Console.WriteLine ( );
}
static void Main() {
Queue q = new Queue ( );
foreach(int i in q)
Console.Write(i + " ");
ShowEnq(q, 22);
ShowEnq(q, 65);
ShowEnq(q, 91);
ShowDeq(q);
ShowDeq(q);
ShowDeq(q);
try {
ShowDeq(q);
)
catch (InvalidOperationException)
{ Console.WriteLine("Черга порожня.");
Ця програма дає наступний результат.
Помістити в чергу: Enqueue(22)
Вміст черги: 22
Помістити в чергу: Enqueue(65)
Вміст черги:22 65
Помістити в чергу: Enqueue(91)
Вміст черги: 22 65 91
Витягнути з черги: Dequeue -> 22
Вміст черги: 65 91
Витягнути з черги: Dequeue -> 65
Вміст черги: 91
Витягнути з черги: Dequeue -> 91
Вміст черги:
Витягнути з черги: Dequeue -> Черга пуста
Зберігання окремих бітів у класі колекції BitArray
Клас BitArray служить для зберігання окремих битов у колекції. А оскільки в колекції цього класу зберігаються біти, а не об'єкти, те своїми можливостями він відрізняється від класів інших колекцій. Проте в класі BitArray реалізуються інтерфейси ICollection і IEnumerable як основні елементи підтримки всіх типів колекцій. Крім того, у класі BitArray реалізується інтерфейс ICloneable.
У класі BitArray визначено трохи конструкторів. Так, за допомогою наведеного нижче конструктора можна сконструювати об'єкт типу BitArray з масиву логічних значень.
public BitArray(bool[] values)
У цьому випадку кожен елемент масиву values стає окремим бітом у колекції. Це означає, що кожному елементу масиву values відповідає окремий біт у колекції. Більше того, порядок розташування елементів у масиві values зберігається й у колекції відповідних їм бітів.
Колекцію типу BitArray можна також скласти з масиву байтів, використовуючи наступний конструктор. Тут бітами в колекції стає вже цілий їхній набір з масиву bytes, причому елемент bytes [ 0 ] позначає перші 8 бітів, елемент bytes [ 1 ] - другі 8 битов і т.д. Аналогічно, колекцію типу BitArray можна скласти з масиву целочисленных значень, використовуючи наведений нижче конструктор.
public BitArray(int[ ] values)
У цьому випадку елемент values [0] позначає перші 32 біта, елемент values [ 1 ] - другі 32 біта й т.д.
За допомогою наступного конструктора можна скласти колекцію типу BitArray, указавши її конкретний розмір:
public BitArray(int length)
де length позначає кількість битов у колекції, які инициализируются логічним значенням false. У наведеному нижче конструкторі можна вказати не тільки розмір колекції, але й первісне значення складових її битов.
public BitArray(int length, bool defaultValue)
У цьому випадку всі біти в колекції инициализируются значенням defaultValue, переданим конструкторові як параметр.
І нарешті, нову колекцію типу BitArray можна створити із уже існуючої, використовуючи наступний конструктор.
public BitArray(BitArray bits)
Знову сконструйований об'єкт буде містити така ж кількість битов, як й у вказує коллекции, що, bits, а в іншому це будуть дві зовсім різні колекції.
Колекції типу BitArray підлягають індексуванню. По кожному індексі вказується окремий біт у колекції, причому нульовий індекс позначає молодший біт.
У класі BitArray визначається ряд власних методів, крім тих, що вже оголошено в інтерфейсах, які в ньому реалізуються. Методи цього класу наведені в табл. 25.9. Зверніть увагу на те, що в класі BitArray не підтримується метод Synchronized (). Це означає, що для колекцій даного класу синхронізована оболонка недоступна, а властивість IsSynchronized завжди має логічне значення false. Проте для керування доступом до колекції типу BitArray її можна синхронізувати для об'єкта, надаваного згадуваної раніше властивістю SyncRoot.
Таблиця 25.9. Методи, певні в класі BitArray
Метод |
Опис |
public BitArray And (BitArray value) |
Виконує операцію логічного множення І бітів об'єкта і колекції value. пвертає колекцію типу BitArray, що містить результат
|
public bool Get (int index) |
Повертає значення біта, що вказує по індексі index
|
public BitArray Not() |
Виконує операцію поразрядного логічного заперечення НЕ бітів колекції і повертає колекцію типу BitArray, що містить результат. |
public BitArray Or(BitArray value)
|
Виконує операцію логічного додавання АБО бітів зухвалого об'єкта й колекції value. |
public void Set(int index, bool value)
|
Установлює біт, що вказує по індексі index, рівним значенню value |
public void SetAll(bool value)
|
Установлює всі біти рівними значенню value |
public BitArray Xor(BitArray value)
|
Виконує логічну операцію що виключає АБО над бітами об'єкта й колекції value. Повертає колекцію типу BitArray, що містить результат |
У класі BitArray визначається також власна властивість, крім тих, що зазначено в інтерфейсах, які в ньому реалізуються.
public int Length { get; set; }
Властивість Length дозволяє встановити або одержати кількість бітів у колекції. Отже, воно повертає таке ж значення, як і стандартна властивість Count, обумовлене для всіх колекцій. На відміну від властивості Count, властивість Length доступно не тільки для читання, але й для запису, і виходить, з його допомогою можна змінити розмір колекції типу BitArray. Так, при скороченні колекції типу BitArray зайві біти усікаються, починаючи зі старшого розряду. А при розширенні колекції типу BitArray додаткові біти, що мають логічне значення false, уводяться в колекцію, починаючи з того ж старшого розряду.
Крім того, у класі BitArray визначається наступний індексатор.
public bool this[int index] { get; set; }
За допомогою цього індексатора можна получити або встановити значення елемента. У наведеному нижче прикладі демонструється застосування класу BitArray.
// Продемонструвати застосування класу BitArray.
using System;
using System.Collections;
class BADemo {
public static void ShowBits(string rem,
BitArray bits) (
Console.WriteLine(rem);
for(int i=0; i < bits.Count; i++)
Console.Write ("{0, -6} ", bits[i]);
Console.WriteLine("\n");
)
static void Main() {
BitArray ba = new BitArray(8); byte[] b = { 67 );
BitArray ba2 = new BitArray(b);
ShowBits("Вихідний уміст колекції Ьа:", Ьа); ba = ba.Not();
ShowBits("Уміст колекції Ьа після логічної операції NOT:", Ьа);
ShowBits("Уміст колекції Ьа2:", Ьа2);
BitArray Ьаз = Ьа.Хог(Ьа2);
ShowBits("Результат логічної операції ba XOR Ьа2:", Ьаз);
Ця програма дає наступний результат.
Вихідний уміст колекції bа:
False False False False False False False False
Уміст колекції ba після логічної операції
NOT: True True True True True True True True
Уміст колекції Ьа2:
True True False False False False /True False
Результат логічної операції ba XOR ba2:
False False True True True True False True
Спеціальні колекції
У середовищі .NET Framework передбачений ряд спеціальних колекцій, оптимізованих для роботи з даними конкретного типу або для їхньої обробки особливим образом. Класи цих неузагальнених колекцій визначені в просторі імен System. Collections. Specialized і перераховані нижче.
Клас спеціальної колекції
|
Опис |
CollectionsUtil
|
Містить фабричні методи для створення колекцій |
HybridDictionary
|
Призначений для колекцій, у яких для зберігання невеликої кількості пара “джерело-значення" використається клас ListDictionary. При перевищенні колекцією певного розміру автоматично використається клас Hashtable для зберігання її елементів |
ListDictionary
|
Призначений для колекцій, у яких для зберігання пар “ключ-значення” використається зв'язний список. Такі колекції рекомендуються тільки для зберігання невеликої кількості елементів |
NameValueCollection
|
Призначений для відсортованих колекцій, у яких зберігаються пари “джерело-значення”, причому й ключ, і значення ставляться до типу string |
OrderedDictionary |
Призначений для колекцій, у яких зберігаються индексируемые пари “джерело-значення" |
StringCollection |
Призначений для колекцій, оптимизированных для зберігання символьних рядків |
StringDictionary
|
Призначений для хеш-таблиць, у яких зберігаються пари “джерело-значення”, причому й ключ, і значення ставляться до типу string |
Крім того, у просторі імен System. Collections визначені три базових абстрактних класи: CollectionBase, ReadOnlyCollectionBase і DictionaryBase. Ці класи можуть успадковуватися й служити як відправна крапка для розробки власних спеціальних колекцій.
Узагальнені колекції
Завдяки впровадженню узагальнень прикладний інтерфейс Collections API значно розширився, у результаті чого кількість класів колекцій й інтерфейсів подвоїлося. Узагальнені колекції оголошуються в просторі імен System. Collections . Generic. Як правило, класи узагальнених колекцій є не більш ніж узагальненими еквівалентами класів, що розглядалися раніше, неузагальнених колекцій, хоча ця відповідність не є взаємно однозначним. Наприклад, у класі узагальненої колекції LinkedList реалізується двунаправленный список, тоді як у неузагальненому еквіваленті його не існує. У деяких випадках ті самі функції існують паралельно в класах узагальнених і неузагальнених колекцій, хоча й під різними іменами. Так, узагальнений варіант класу ArrayList називається List, а узагальнений варіант класу HashTable - Dictionary. Крім того, конкретний уміст різних інтерфейсів і класів реорганізується з мінімальними змінами для переносу деяких функцій з одного інтерфейсу в іншій. Але в цілому, маючи ясне подання про неузагальнені колекції, можна без особливої праці навчитися застосовувати й узагальнені колекції.
Як правило, узагальнені колекції діють по тім же принципі, що й неузагальнені, за винятком того, що узагальнені колекції типізовані. Це означає, що в узагальненій колекції можна зберігати тільки ті елементи, які сумісні по типі з її аргументом. Так, якщо потрібна колекція для зберігання незв'язаних один з одним різнотипних даних, то для цієї мети варто використати класи неузагальнених колекцій. А у всіх інших випадках, коли в колекції повинні зберігатися об'єкти тільки одного типу, вибір рекомендується зупиняти на класах узагальнених колекцій.
Узагальнені колекції визначаються в ряді інтерфейсів і класів, що реалізують ці інтерфейси. Всі вони описуються далі один по одному.
Інтерфейси узагальнених колекцій
У просторі імен System. Collections . Generic визначений цілий ряд інтерфейсів узагальнених колекцій, що мають відповідні аналоги серед інтерфейсів неузагальнених колекцій. Всі ці інтерфейси зведені в табл. 25.10.
Таблиця 25.10. Інтерфейси узагальнених колекцій
Інтерфейс |
Опис |
ICollection< T> |
Визначає основні властивості узагальнених колекцій |
IComparer<T> |
Визначає узагальнений метод Compare() для порівняння об'єктів, що зберігаються в колекції |
IDictionary<Tkey, TValue> |
Визначає узагальнену колекцію, що складається з пар"джерело-значення" |
IEnumerable<T> |
Визначає узагальнений метод GetEnumerator (),перечисельник, що надає, для будь-якого класу колекції |
Enumerator<T> |
Надає методи, що дозволяють одержувати вміст колекції по черзі |
IEqualityComparer<T> |
Порівнює два об'єкти на предмет рівності |
IList<T> |
Визначає узагальнену колекцію, доступ до якої можна одержати за допомогою індексатора |
Інтерфейс ICollection<T>
В інтерфейсі ICollection<T> визначений ряд властивостей, які є загальними для всіх узагальнених колекцій. Інтерфейс ICollection<T> є узагальненим варіантом неузагальненого інтерфейсу ICollection, хоча між ними є деякі відмінності.
Отже, в інтерфейсі ICollection<T> визначені наступні властивості.
