Сортированный словарь: класс SortedDictionary<TKey, TValue>
58C# --- Руководство по C# --- Сортированный словарь: класс SortedDictionary<TKey, TValue>
Класс 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();
}
}
}