
- •Лабораторная работа №4 коллекции в языке c#
- •Домашнее задание и методические указания по его выполнению
- •Основные понятия
- •2.2. Классы коллекций общего назначения
- •2.2.1. Класс ArrayList
- •2.2.2. Класс Hashtable
- •2.2.3. Класс SortedList
- •2.2.4. Класс Stack
- •2.2.5. Класс Queue
- •3. Лабораторное задание и методические указания по его выполнению
- •4. Варианты заданий
- •Библиографический список
2.2.2. Класс Hashtable
Класс Hashtable предназначен для создания коллекции, в которой для хранения объектов используется хеш-таблица. Возможно, многим известно, что в хеш-таблице для хранения информации используется механизм, именуемый хешированием (hashing). Суть хеширования состоит в том, что для определения уникального значения, которое называется хэш-кодом, используется информационное содержимое соответствующего ему ключа. Хэш-код затем используется в качестве индекса, по которому в таблице отыскиваются данные, соответствующие этому ключу. Преобразование ключа в хэш-код выполняется автоматически, т.е. сам хэш-код вы даже не увидите. Но преимущество хеширования — в том, что оно позволяет сохранять постоянным время выполнения таких операций, как поиск, считывание и запись данных, даже для больших объемов информации. Класс Hashtable реализует интерфейсы IDictionary, ICollection, IEnumerable, ISerializable, IDeserializationCallback и ICloneable. В классе Hashtable определено множество конструкторов, включая следующие (они используются чаще всего):
public Hashtable()
public Hashtable(IDictionary с)
public Hashtable(int capacity)
public Hashtable(int capacity, float fillRatio)
П
14
Таблица 2.2.2.1 – Собственные методы класса Hashtable
public virtual bool ContainsKey (object k) |
Возвращает значение true, если в вызывающей Hashtable-коллекции содержится ключ, заданный параметром k. В противном случае возвращает значение false |
public virtual bool ContainsValue (object v) |
Возвращает значение true, если в вызывающей Hashtable-коллекции содержится значение, заданное параметром v. В противном случае возвращает значение false |
public virtual IDictionaryEnumerator GetEnumerator() |
Возвращает для вызывающей Hashtable-коллекции нумератоp типа IDictionaryEnumerator. |
public static Hashtable Synchronized (Hashtable ht) |
Возвращает синхронизированную версию вызывающей Hashtable-коллекции, переданной в параметре ht |
В классе Hashtable, помимо свойств, определенных в реализованных им интерфейсах, также определены два собственных public-свойства. Используя следующие свойства, можно из Hashtable-коллекции получить коллекцию ключей или значений:
public virtual ICollection Keys { get; }
public virtual ICollection Values { get; }
Поскольку в классе Hashtable не предусмотрена поддержка упорядоченных коллекций, при получении коллекции ключей или значений заданный порядок элементов не достигается. В классе Hashtable также определены два protected-свойства с именами Нср и Comparer, которые доступны для производных классов.
В классе Hashtable пары ключ/значение хранятся в форме структуры типа DictionaryEntry, но по большей части вас это не будет касаться, поскольку свойства и методы обрабатывают ключи и значения отдельно. Например, при добавлении элемента в Hashtable-коллекцию необходимо вызвать метод Add(), который принимает два отдельных аргумента: ключ и значение.
Важно отметить, что Hashtable-коллекция не гарантирует сохранения порядка элементов. Дело в том, что хеширование обычно не применяется к отсортированным таблицам.
Рассмотрим пример, который демонстрирует использование Hashtable-коллекции:
// Демонстрация использования Hashtable-коллекции.
using System;
using System.Collections;
class HashtableDemo {
public 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, использует ключ в роли индекса.