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

31

Если нужна коллекция, отсортированная по ключу, можно воспользоваться SortedList<TKey, TValue> Этот класс сортирует элементы на основе значения ключа. Можно использовать не только любой тип значения, но также и любой тип ключа.

В классе SortedList<TKey, TValue> реализуются интерфейсы IDictionary, IDictionary<TKey, TValue>, ICollection, ICollection<KeyValuePair<TKey, TValue>>, IEnumerable и IEnumerable<KeyValuePair<TKey, TValue>. Размер коллекции типа SortedList<TKey, TValue> изменяется динамически, автоматически увеличиваясь по мере необходимости. Класс SortedList<TKey, TValue> подобен классу SortedDictionary<TKey, TValue>, но у него другие рабочие характеристики. В частности, класс SortedList<TKey, TValue> использует меньше памяти, тогда как класс SortedDictionary<TKey, TValue> позволяет быстрее вставлять неупорядоченные элементы в коллекцию.

В классе SortedList<TKey, TValue> предоставляется немало конструкторов. Ниже перечислены наиболее часто используемые конструкторы этого класса:

public SortedList()
public SortedList(IDictionary<TKey, TValue> dictionary)
public SortedList(int capacity)
public SortedList(IComparer<TK> comparer)

В первой форме конструктора создается пустой список с выбираемой по умолчанию первоначальной емкостью. Во второй форме конструктора создается отсортированный список с указанным количеством элементов dictionary. В третьей форме конструктора с помощью параметра capacity задается емкость коллекции, создаваемой в виде отсортированного списка. Если размер списка заранее известен, то, указав емкость создаваемой коллекции, можно исключить изменение размера списка во время выполнения, что, как правило, требует дополнительных затрат вычислительных ресурсов. И в четвертой форме конструктора допускается указывать с помощью параметра comparer способ сравнения объектов, содержащихся в списке.

Емкость коллекции типа SortedList<TKey, TValue> увеличивается автоматически по мере необходимости, когда в список добавляются новые элементы. Если текущая емкость коллекции превышается, то она увеличивается. Преимущество указания емкости коллекции типа SortedList<TKey, TValue> при ее создании заключается в снижении или полном исключении издержек на изменение размера коллекции. Разумеется, указывать емкость коллекции целесообразно лишь в том случае, если заранее известно, сколько элементов требуется хранить в ней.

В классе SortedList<TKey, TValue> определяется ряд собственных методов, помимо тех, что уже объявлены в интерфейсах, которые в нем реализуются. Некоторые из наиболее часто используемых методов этого класса перечислены ниже:

Add()

Добавляет в список пару "ключ-значение". Если ключ уже находится в списке, то его значение не изменяется, и генерируется исключение ArgumentException

ContainsKey()

Возвращает логическое значение true, если вызывающий список содержит объект key в качестве ключа; а иначе — логическое значение false

ContainsValue()

Возвращает логическое значение true, если вызывающий список содержит значение value; в противном случае — логическое значение false

GetEnumerator()

Возвращает перечислитель для вызывающего словаря

IndexOfKey(), IndexOfValue()

Возвращает индекс ключа или первого вхождения значения в вызывающем списке. Если искомый ключ или значение не обнаружены в списке, возвращается значение -1.

Remove()

Удаляет из списка пару "ключ-значение" по указанному ключу key. При удачном исходе операции возвращается логическое значение true, а если ключ key отсутствует в списке — логическое значение false.

TrimExcess()

Сокращает избыточную емкость вызывающей коллекции в виде отсортированного списка.

Кроме того, в классе SortedList<TK, TV> определяются собственные свойства, помимо тех, что уже объявлены в интерфейсах, которые в нем реализуются. Эти свойства приведены ниже:

Capacity

Получает или устанавливает емкость вызывающей коллекции в виде отсортированного списка

Comparer

Получает метод сравнения для вызывающего списка

Keys

Получает коллекцию ключей

Values

Получает коллекцию значений

И наконец, в классе SortedList<TKey, TValue> реализуется приведенный ниже индексатор, определенный в интерфейсе IDictionary<TKey, TValue>

public TValue this[TKey key] { get; set; }

Этот индексатор служит для получения и установки значения элемента коллекции, а также для добавления в коллекцию нового элемента. Но в данном случае в качестве индекса служит ключ элемента, а не сам индекс. Давайте рассмотрим пример использования сортированного списка:

using System;
using System.Collections.Generic;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main()
        {
            // Создадим коллекцию сортированного списка

            SortedList<string, string> UserInfo = new SortedList<string, string>();

            // Добавим несколько элементов в коллекию
            UserInfo.Add("Zack", "12345");
            UserInfo.Add("Den", "12345");
            UserInfo.Add("Alex", "12345");
            UserInfo.Add("John", "12345");
            UserInfo.Add("Elhm", "12345");
            UserInfo.Add("Lamar", "12345");
            
            

            // Коллекция ключей
            ICollection<string> keys = UserInfo.Keys;

            // Теперь используем ключи, для получения значений
            foreach (string s in keys)
                Console.WriteLine("User: {0}, Password: {1}", s, UserInfo[s]);

            Console.ReadLine();
        }
    }
}
Использование сортированнного списка
Пройди тесты
Лучший чат для C# программистов