Сортированный словарь: класс SortedDictionary
Класс SortedDictionary<TKey, Tvalue> представляет дерево бинарного поиска, в котором все элементы отсортированы на основе ключа. Тип ключа должен реализовать интерфейс IComparable<TKey>. Если тип ключа не сортируемый, компаратор можно также создать, реализовав IComparer<TKey> и указав его в качестве аргумента конструктора сортированного словаря.
Классы SortedDictionary<TKey, Tvalue> и SortedList<TKey, TValue> имеют схожую функциональность. Но поскольку SortedList<TKey, TValue> реализован в виде списка, основанного на массиве, a SortedDictionary<TKey, Tvalue> реализован как словарь, эти классы обладают разными характеристиками:
-
SortedList<TKey, TValue> использует меньше памяти, чем SortedDictionary<TKey, TValue>
-
SortedDictionary<TKey, TValue> быстрее вставляет и удаляет элементы.
-
При наполнении коллекции отсортированными данными SortedList<TKey,TValue> работает быстрее, если при этом не требуется изменение емкости.
В классе SortedDictionary<TKey, TValue> реализуются интерфейсы IDictionary, IDictionary<TKey, TValue>, ICollection, ICollection<KeyValuePair<TKey, TValue>>, IEnumerable и IEnumerable<KeyValuePair<TKey, TValue>>. В классе SortedDictionary<TKey, TValue> предоставляются также следующие конструкторы:
public SortedDictionary() public SortedDictionary(IDictionary<TKey, TValue> dictionary) public SortedDictionary(IComparer<TKey> comparer) public SortedDictionary(IDictionary<TKey, TValue> dictionary, IComparer<TKey> comparer)
В первом конструкторе создается пустой словарь, во втором конструкторе — словарь с указанным количеством элементов dictionary. В третьем конструкторе допускается указывать с помощью параметра comparer типа IComparer способ сравнения, используемый для сортировки, а в четвертом конструкторе — инициализировать словарь, помимо указания способа сравнения.
В классе SortedDictionary<TKey, TValue> определен ряд методов. Некоторые наиболее часто используемые методы этого класса приведены ниже:
- Add()
-
Добавляет в словарь пару "ключ-значение", определяемую параметрами key и value. Если ключ key уже находится в словаре, то его значение не изменяется, и генерируется исключение ArgumentException
- ContainsKey()
-
Возвращает логическое значение true, если вызывающий словарь содержит объект key в качестве ключа; в противном случае — логическое значение false
- ContainsValue()
-
Возвращает логическое значение true, если вызывающий словарь содержит значение value, в противном случае — логическое значение false
- Remove()
-
Удаляет ключ key из словаря. При удачном исходе операции возвращается логическое значение true, а если ключ key отсутствует в словаре — логическое значение false
Следует иметь в виду, что ключи и значения, содержащиеся в коллекции, доступны отдельными списками с помощью свойств Keys и Values. В коллекциях типа SortedDictionary<TKey, TValue>.KeyCollection и SortedDictionary<TKey, TValue>.ValueCollection реализуются как обобщенные, так и необобщенные формы интерфейсов ICollection и IEnumerable.
И наконец, в классе SortedDictionary<TKey, TValue> реализуется приведенный ниже индексатор, определенный в интерфейсе IDictionary<TKey, TValue>:
public TValue this[TKey key] { get; set; }
Этот индексатор служит для получения и установки значения элемента коллекции, а также для добавления в коллекцию нового элемента. Но в данном случае в качестве индекса служит ключ элемента, а не сам индекс. Давайте рассмотрим пример использования сортированного словаря:
using System; using System.Collections.Generic; namespace ConsoleApplication1 { class UserInfo { // Метод, реализующий словарь public static SortedDictionary<string, string> MyDic(int i) { SortedDictionary<string, string> dic = new SortedDictionary<string,string>(); string s, s1; for (int j = 0; j < i; j++) { Console.Write("\nВведите ключ: "); s1 = Console.ReadLine(); Console.WriteLine("Введите имя сотрудника"); Console.Write("Name{0} --> ",j); s = Console.ReadLine(); dic.Add(s1, s); } return dic; } } class Program { static void Main() { Console.Write("Сколько сотрудников добавить? "); try { int i = int.Parse(Console.ReadLine()); SortedDictionary<string, string> dic = UserInfo.MyDic(i); // Получить коллекцию ключей ICollection<string> keys = dic.Keys; Console.WriteLine("\nСортированная база данных содержит: "); foreach (string j in keys) Console.WriteLine("ID -> {0} Name -> {1}",j,dic[j]); } catch (FormatException) { Console.WriteLine("Неверный ввод"); } Console.ReadLine(); } } }
Комментарии