C# 4.0 полное руководство - 2011 - Герберт Шилдт
Шрифт:
Интервал:
Закладка:
В приведенном ниже примере демонстрируется применение класса SortedDictionary<TKey, TValueX Это измененный вариант предыдущего примера, демонстрировавшего применение класса Dictionary<TKey, TValueX В данном варианте база данных работников отсортирована по фамилии и имени работника, которые служат в качестве ключа.
// Продемонстрировать применение класса обобщенной // коллекции SortedDictionary<TKey, TValueX
using System;
using System.Collections.Generic;
class GenSortedDictionaryDemo { static void Main() {
// Создать словарь для хранения имен и фамилий // работников и их зарплаты.
SortedDictionary<string, double> diet =
new SortedDictionary<string, double>();
// Добавить элементы в коллекцию, diet.Add("Батлер, Джон", 73000); diet.Add("Шварц, Capa", 59000); diet.Add("Пайк, Томас", 45000); diet.Add("Фрэнк, Эд", 99000);
// Получить коллекцию ключей, т.е. фамилий и имен.
ICollection<string> с = diet.Keys;
// Использовать ключи для получения значений, т.е. зарплаты, foreach(string str in с)
Console.WriteLine("{0}, зарплата: {1:C}", str, diet[str]);
}
}
Эта программа дает следующий результат.
Батлер, Джон, зарплата: $73,000.00 Пайк, Томас, зарплата: $45,000.00 Фрэнк, Эд, зарплата: $99,000.00 Шварц, Сара, зарплата: $59,000.00
Как видите, список работников и их зарплаты отсортированы по ключу, в качестве которого в данном случае служит фамилия и имя работника.
Класс SortedListCTKey, TValue>
В коллекции класса SortedList<TKey, TValue> хранится отсортированный список пар "ключ-значение". Это обобщенный эквивалент класса необобщенной коллекции SortedList. В классе 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>, но у него другие рабочие характеристики. В частности, класс SortedListcTKey, TValue> использует меньше памяти, тогда как класс SortedDicti-onary<TKey, TValue> позволяет быстрее вставлять неупорядоченные элементы в коллекцию.
В классе SortedListcTKey, TValue> предоставляется немало конструкторов. Ниже перечислены наиболее часто используемые конструкторы этого класса.
public SortedList ()
public SortedList(IDictionaryCTKey, TValue> dictionary)
public SortedList(int capacity)
public SortedList(IComparer<TK> comparer)
В первой форме конструктора создается пустой список с выбираемой по умолчанию первоначальной емкостью. Во второй форме конструктора создается отсортированный список с указанным количеством элементов dictionary. В третьей форме конструктора с помощью параметра capacity задается емкость коллекции, создаваемой в виде отсортированного списка. Если размер списка заранее известен, то, указав емкость создаваемой коллекции, можно исключить изменение размера списка во время выполнения, что, как правило, требует дополнительных затрат вычислительных ресурсов. И в четвертой форме конструктора допускается указывать с помощью параметра comparer способ сравнения объектов, содержащихся в списке.
Емкость коллекции типа SortedListcTKey, TValue> увеличивается автоматически по мере необходимости, когда в список добавляются новые элементы. Если текущая емкость коллекции превышается, то она увеличивается. Преимущество указания емкости коллекции типа SortedListcTKey, TValue> при ее создании заключается в снижении или полном исключении издержек на изменение размера коллекции. Разумеется, указывать емкость коллекции целесообразно лишь в том случае, если заранее известно, сколько элементов требуется хранить в ней.
В классе SortedListcTKey, TValue> определяется ряд собственных методов, помимо тех, что уже объявлены в интерфейсах, которые в нем реализуются. Некоторые из наиболее часто используемых методов этого класса перечислены в табл. 25.19. Следует иметь в виду, что перечислитель, возвращаемый методом GetEnumerator (), служит для перечисления пар "ключ-значение", хранящихся в отсортированном списке в виде объектов типа KeyValuePair.
Таблица 25.19. Наиболее часто используемые методы, определенные в классе SortedListCTKey, TValue>
Метод Описание
public void Add (TKey key, Добавляет в список пару “ключ-значение",
TValue value) определяемую параметрами key и value.
Если ключ key уже находится в списке, то его значение не изменяется, и генерируется исключение ArgumentException public bool ContainsKey (ТК key) Возвращает логическое значение true, если вы
зывающий список содержит объект key в каче-_стве ключа; а иначе —логическое значение false
Метод
Описание
public bool
ContainsValue(TValue value)
public IEnumerator<KeyValuePair CTKey, TValue>> GetEnumerator() public int IndexOfKey(TKey key)
public int IndexOfValue(TValue value)
public bool Remove(TKey key)
public void RemoveAt(int index) public void TrimExcessO
Возвращает логическое значение true, если вызывающий список содержит значение value; в противном случае — логическое значение false
Возвращает перечислитель для вызывающего словаря
Возвращает индекс ключа key. Если искомый ключ не обнаружен в списке, возвращается значение -1
Возвращает индекс первого вхождения значения value в вызывающем списке. Если искомое значение не обнаружено в списке, возвращается значение -1 Удаляет из списка пару “ключ-значение” по указанному ключу key. При удачном исходе операции возвращается логическое значение true, а если ключ key отсутствует в списке — логическое значение false Удаляет из списка пару “ключ-значение” по указанному индексу index Сокращает избыточную емкость вызывающей коллекции в виде отсортированного списка
Кроме того, в классе SortedList<TK, TV> определяются собственные свойства, помимо тех, что уже объявлены в интерфейсах, которые в нем реализуются. Эти свойства приведены ниже.
Свойство
Описание
public int Capacity { get; set; }
Получает или устанавливает емкость
вызывающей коллекции в виде отсо
ртированного списка
public IComparer<TK> Comparer { get;
■ } Получает метод сравнения для вызы
вающего списка
public IList<TK> Keys { get; }
Получает коллекцию ключей
public IList<TV> Values { get; }
Получает коллекцию значений
И наконец, в классе SortedList<TKey,
TValue> реализуется приведенный ниже
индексатор, определенный в интерфейсе IDictionaryCTKey, TValueX
public TValue this[TKey key] { get; set;
} .
Этот индексатор служит для получения и
установки значения элемента коллекции,
а также для добавления в коллекцию нового элемента. Но в данном случае в качестве
индекса служит ключ элемента, а не сам индекс.
В приведенном ниже примере демонстрируется применение класса
SortedList<TKey, TValueX Это еще один измененный вариант представленного
ранее примера базы данных работников. В данном варианте база данных хранится в коллекции типа SortedList.
// Продемонстрировать применение класса обобщенной // коллекции SortedList<TKey, TValue>.
using System;
using System.Collections.Generic;
class GenSLDemo {
static void Main() {
// Создать коллекцию в виде отсортированного списка // для хранения имен и фамилий работников и их зарплаты.
SortedList<string, double> si =
new SortedList<string, double>();
// Добавить элементы в коллекцию, si.Add("Батлер, Джон", 73000); si.Add("Шварц, Capa", 59000); si.Add("Пайк, Томас", 45000); si.Add("Фрэнк, Эд", 99000);
// Получить коллекцию ключей, т.е. фамилий и имен.
ICollection<string> с = si.Keys;
// Использовать ключи для получения значений, т.е. зарплаты, foreach(string str in с)
Console.WriteLine("{0}, зарплата: {1:C}", str, si[str]);
Console.WriteLine();
}
}