![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Типы для работы с коллекциями-словарями
Под термином словарь будем понимать коллекцию, которая хранит пары «ключ-значение» с возможностью доступа к элементам по ключу. Базовая библиотека платформы.NET предлагает несколько коллекций-словарей, как классических, так и с различными дополнительными возможностями. Универсальный класс Dictionary< TKey, TValue> – классический словарь с возможностью указать тип для ключа и тип для значения[9]. Данный класс является одним из наиболее часто используемых классов-коллекций (наряду с классом List< T>). Класс Dictionary< TKey, TValue> реализует обе версии интерфейса IDictionary (обычную и универсальную). Пример использования класса приведён ниже. // конструируем словарь и помещаем в него один элемент // обратите внимание на синтаксис инициализации словаря var d = new Dictionary< string, int> {{" One", 1}};
// помещаем элементы, используя индексатор и метод Add() d[" Two" ] = 22; d.Add(" Three", 3);
// обновляем существующий элемент d[" Two" ] = 2;
Console.WriteLine(d[" Two" ]); Console.WriteLine(d.ContainsKey(" One")); // быстрая операция Console.WriteLine(d.ContainsValue(3)); // медленная операция
int val; if (! d.TryGetValue(" ONE", out val)) { Console.WriteLine(" No such value"); }
// различные способы перечисления словаря foreach (var pair in d) { Console.WriteLine(pair.Key + "; " + pair.Value); } foreach (string key in d.Keys) { Console.WriteLine(key); } foreach (int value in d.Values) { Console.WriteLine(value); } Словарь может работать с элементами любого типа, так как у любого объекта можно получить хэш-код и сравнить объекты на равенство, используя методы GetHashCode() и Equals(). Пользовательские типы могут переопределять данные методы, предоставляя их эффективную реализацию. Кроме этого, конструктору словаря можно передать объект, реализующий интерфейс IEqualityComparer< TKey>. Типичным примером использования такого подхода является конструирование словаря, обеспечивающего сравнение строк-ключей независимо от их регистра: var comparer = StringComparer.OrdinalIgnoreCase; var d = new Dictionary< string, int> (comparer); Класс OrderedDictionary – слаботипизированный класс, запоминающий порядок добавления элементов в словарь. В некотором смысле, данный класс является комбинацией классов Hashtable и ArrayList. Для доступа к элементам в OrderedDictionary можно применять как ключ, так и целочисленный индекс. Класс ListDictionary использует для хранения элементов словаря не хэш-таблицу, а односвязный список. Это делает данный класс неэффективным при работе с большими наборами данных. ListDictionary рекомендуется использовать, если количество хранимых элементов не превышает десяти. Класс HybridDictionary – это форма словаря, использующая список для хранения при малом количестве элементов, и переключающаяся на применение хэш-функции, когда количество элементов превышает определённый порог. Оба класса ListDictionary и HybridDictionary являются слаботипизированными и находятся в пространстве имён System.Collections.Specialized. Платформа.NET предоставляет три класса-словаря, организованных так, что их элементы всегда отсортированы по ключу: SortedDictionary< TKey, TValue>, SortedList и SortedList< TKey, TValue>. Данные классы используют разные внутренние структуры для хранения элементов словаря. Класс SortedDictionary< TKey, TValue> быстрее классов SortedList и SortedList< TKey, TValue> при выполнении вставки элементов. Но классы SortedList и SortedList< TKey, TValue> могут предоставить возможность, которой нет у SortedDictionary< TKey, TValue> – доступ к элементу не только по ключу, но и с использованием целочисленного индекса.
|