Сортированный список: класс SortedList
Если нужна коллекция, отсортированная по ключу, можно воспользоваться 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(); } } }
Комментарии