Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методические указания 4 C#.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
195.07 Кб
Скачать

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

ервая форма позволяет создать стандартный объект класса Hashtable. Вторая для инициализации Hashtable-объекта использует элементы заданной коллекции c. Третья инициализирует емкость создаваемой хэш-таблицы значением capacity, а четвертая — как емкость (значением capacity), так и коэффициент заполнения (значением fillRatio). Значение коэффициента заполнения (также именуемого коэффициентом нагрузки), которое должно попадать в диапазон 0,1-1,0, определяет степень заполнения хеш-таблицы, после чего ее размер увеличивается. В частности, размер таблицы увеличится, когда количество элементов станет больше емкости таблицы, умноженной на ее коэффициент заполнения. Для конструкторов, которые в качестве параметра не принимают коэффициент заполнения, используется значение 1,0. В классе Hashtable помимо методов, определенных в реализованных им интерфейсах, также определены собственные методы. Наиболее употребимые из них перечислены в таблице 2.2.2.1. Чтобы определить, содержит ли Hashtable-коллекция заданный ключ, достаточно вызвать метод ContainsKey (). А чтобы узнать, хранится ли в интересующей вас хеш-таблице заданное значение, вызовите метод ContainsValue (). Для опроса элементов Hashtable-коллекции необходимо получить нумератор типа IDictionaryEnumerator, вызвав метод GetEnumerator (). Вспомните, что для опроса содержимого коллекции, в которой хранятся пары ключ/значение, используется именно класс IDictionaryEnumerator.

Таблица 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, использует ключ в роли индекса.