В классе Hashtable
доступны также открытые свойства, определенные в тех интерфейсах, которые в нем реализуются. Особая роль принадлежит двум свойствам, Keys
и Values
, поскольку с их помощью можно получить ключи или значения из коллекции типа Hashtable
. Эти свойства определяются в интерфейсе IDictionary
следующим образом.
public virtual ICollection Keys { get; }
public virtual ICollection Values { get; }
В классе Hashtable
не поддерживаются упорядоченные коллекции, и поэтому ключи или значения получаются из коллекции в произвольном порядке. Кроме того, в классе Hashtable
имеется защищенное свойство EqualityComparer
. А два других свойства, hcp
и 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. Эта емкость соответствует размеру базового массива, используемого для хранения элементов коллекции. И в четвертой форме конструктора с помощью параметра сотпрагег указывается способ, используемый для сравнения объектов по списку. В этой форме создается пустая коллекция, первоначальная емкость которой равна нулю.
Читать дальше