Сортированный словарь: класс SortedDictionary<TKey, TValue>

58

Класс SortedDictionary<TKey, Tvalue> представляет дерево бинарного поиска, в котором все элементы отсортированы на основе ключа. Тип ключа должен реализовать интерфейс IComparable<TKey>. Если тип ключа не сортируемый, компаратор можно также создать, реализовав IComparer<TKey> и указав его в качестве аргумента конструктора сортированного словаря.

Классы SortedDictionary<TKey, Tvalue> и SortedList<TKey, TValue> имеют схожую функциональность. Но поскольку SortedList<TKey, TValue> реализован в виде списка, основанного на массиве, a SortedDictionary<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();
        }
    }
}
Пример использования словаря
Пройди тесты
Лучший чат для C# программистов