Добавить в цитаты Настройки чтения

Страница 450 из 502

В классе Hashtable определено немало конструкторов. Ниже приведены наиболее часто используемые конструкторы этого класса.

<b>public Hashtable()</b>

<b>public Hashtable(IDictionary d)</b>

<b>public Hashtable(int capacity)</b>

<b>public Hashtable(int capacity, float loadFactor)</b>

В первой форме создается создаваемый по умолчанию объект класса Hashtable. Во второй форме создаваемый объект типа Hashtable инициализируется элементами из коллекции d. В третьей форме создаваемый объект типа Hashtable инициализируется, учитывая емкость коллекции, задаваемую параметром capacity. И в четвертой форме создаваемый объект типа Hashtable инициализируется, учитывая заданную емкость capacity и коэффициент заполнения loadFactor. Коэффициент заполнения, иногда еще называемый коэффициентом загрузки, должен находиться в пределах от 0,1 до 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 ContainsValue(object value) - Возвращает логическое значение true, если в вызывающей коллекции типа Hashtable содержится значение value, а иначе — логическое значение false

public virtual IDictionaryEnumerator GetEnumerator() - Возвращает для вызывающей коллекции типа Hashtable перечислитель типа IDictionaryEnumerator

public static Hashtable Synchronized(Hashtable table) -  Возвращает синхронизированный вариант коллекции типа Hashtable, передаваемой в качестве параметра table

В классе Hashtable доступны также открытые свойства, определенные в тех интерфейсах, которые в нем реализуются. Особая роль принадлежит двум свойствам, Keys и Values, поскольку с их помощью можно получить ключи или значения из коллекции типа Hashtable. Эти свойства определяются в интерфейсе IDictionary следующим образом.

<b>public virtual ICollection Keys { get; }</b>

<b>public virtual ICollection Values { get; }</b>

В классе Hashtable не поддерживаются упорядоченные коллекции, и поэтому ключи или значения получаются из коллекции в произвольном порядке. Кроме того, в классе Hashtable имеется защищенное свойство EqualityComparer. А два других свойства, hcp и comparer, считаются устаревшими.

Пары "ключ-значение" сохраняются в коллекции типа Hashtable в форме структуры типа DictionaryEntry, но чаще всего это делается без прямого вмешательства со стороны пользователя, поскольку свойства и методы оперируют ключами и значениями по отдельности. Если, например, в коллекцию типа Hashtable добавляется элемент, то для этой цели вызывается метод Add(), принимающий два аргумента: ключ и значение.

Нужно, однако, иметь в виду, что сохранение порядка следования элементов в коллекции типа Hashtable не гарантируется. Дело в том, что процесс хеширования оказывается, как правило, непригодным для создания отсортированных таблиц.

Ниже приведен пример программы, в которой демонстрируется применение класса Hashtable.

<b>// Продемонстрировать применение класса Hashtable.</b>

<b>using System;</b>

<b>using System.Collections;</b>

<b>class HashtableDemo {</b>

<b>  static void Main() {</b>

<b>    // Создать хеш-таблицу.</b>

<b>    Hashtable ht = new Hashtable();</b>

<b>    // Добавить элементы в таблицу.</b>

<b>    ht.Add(&quot;здание&quot;, &quot;жилое помещение&quot;);</b>

<b>    ht.Add(&quot;автомашина&quot;, &quot;транспортное средство&quot;);</b>

<b>    ht.Add(&quot;книга&quot;, &quot;набор печатных слов&quot;);</b>

<b>    ht.Add(&quot;яблоко&quot;, &quot;съедобный плод&quot;);</b>

<b>    // Добавить элементы с помощью индексатора,</b>

<b>    ht[&quot;трактор&quot;] = &quot;сельскохозяйственная машина&quot;;</b>

<b>    // Получить коллекцию ключей.</b>