ледовать по ссылкам в обратном направлении: ");
for(node = ll.Last; node != null; node = node.Previous)
Console.Write(node.Value + " ");
Console.WriteLine("\n");
// Удалить из списка два элемента.
Console.WriteLine("Удалить 2 элемента из списка");
// Удалить элементы из связного списка.
ll.Remove('С');
ll.Remove('А');
Console.WriteLine("Количество элементов в списке: " + ll.Count);
// Отобразить содержимое видоизмененного списка в цикле foreach.
Console.Write("Содержимое списка после удаления элементов: ");
foreach(char ch in ll)
Console.Write(ch + " ");
Console.WriteLine("\n");
// Добавить три элемента в конец списка.
ll.AddLast('X');
ll.AddLast('Y');
ll.AddLast('Z');
Console.Write("Содержимое списка после ввода элементов: ");
foreach(char ch in ll)
Console.Write(ch + " ");
Console.WriteLine("\n");
}
}
Ниже приведен результат выполнения этой программы.
Исходное количество элементов в списке: 0
Добавить в список 5 элементов
Количество элементов в списке: 5
Отобразить содержимое списка по ссылкам: Е D С В А
Отобразить содержимое списка в цикле foreach: Е D С В А
Следовать по ссылкам в обратном направлении: А В С D Е
Удалить 2 элемента из списка
Количество элементов в списке: 3
Содержимое списка после удаления элементов: Е D В
Содержимое списка после ввода элементов: Е D В X Y Z
Самое примечательное в этой программе — это обход списка в прямом и обрат
ном направлении, следуя по ссылкам, предоставляемым свойствами Next и Previous.
Двунаправленный характер подобных связных списков имеет особое значение для
приложений, управляющих базами данных, где нередко требуется перемещаться по
списку в обоих направлениях.
Класс Dictionary
Класс Dictionary позволяет хранить пары "ключ-значение"
в коллекции как в словаре. Значения доступны в словаре по соответствующим клю
чам. В этом отношении данный класс аналогичен необобщенному классу Hashtable.
В классе Dictionary реализуются интерфейсы IDictionary,
IDictionary, ICollection, ICollection>, IEnumerable, IEnumerable>,
ISerializable и IDeserializationCallback. В двух последних интерфейсах поддер
живается сериализация списка. Словари имеют динамический характер, расширяясь по
мере необходимости.
В классе Dictionary предоставляется немало конструкторов.
Ниже перечислены наиболее часто используемые из них.
public Dictionary()
public Dictionary(IDictionary dictionary)
public Dictionary(int capacity)
В первом конструкторе создается пустой словарь с выбираемой по умолчанию
первоначальной емкостью. Во втором конструкторе создается словарь с указанным ко
личеством элементов dictionary. А в третьем конструкторе с помощью параметра
сараcity указывается емкость коллекции, создаваемой в виде словаря. Если размер
словаря заранее известен, то, указав емкость создаваемой коллекции, можно исклю
чить изменение размера словаря во время выполнения, что, как правило, требует до
полнительных затрат вычислительных ресурсов.
В классе Dictionary определяется также ряд методов. Некото
рые наиболее часто используемые методы этого класса сведены в табл. 25.17.
Таблица 25.17. Наиболее часто используемые методы, определенные
в классе Dictionary
Метод Описание
public void Add(TKey key, TValue
value)
Добавляет в словарь пару “ключ-значение”,
определяемую параметрами key и value.
Если ключ key уже находится в словаре, то его
значение не изменяется, и генерируется ис
ключение ArgumentException
public bool ContainsKey(TKey
key)
Возвращает логическое значение true, если
вызывающий словарь содержит объект key в
качестве ключа; а иначе — логическое значе
ние false
public bool ContainsValue(TValue
value)
Возвращает логическое значение true, если
вызывающий словарь содержит значение
value; в противном случае — логическое зна
чение false
public bool Remove(TKey key) Удаляет ключ key из словаря. При удачном
исходе операции возвращается логическое
значение true, а если ключ key отсутствует в
словаре — логическое значение false
Кроме того, в классе Dictionary определяются собственные
свойства, помимо тех, что уже объявлены в интерфейсах, которые в нем реализуются.
Эти свойства приведены ниже.
Свойство Описание
public IEqualityComparer
Comparer { get; }
Получает метод сравнения для вызывающего
словаря
public Dictionary.
KeyCollection Keys { get; }
Получает коллекцию ключей
public Dictionary.
ValueCollection Values { get; }
Получает коллекцию значений
Следует иметь в виду, что ключи и значения, содержащиеся в коллекции, доступ
ны отдельными списками с помощью свойств Keys и Values. В коллекциях типа
Dictionary.KeyCollection и Dictionary.
ValueCollection реализуются как обобщенные, так и необобщенные формы интер
фейсов ICoirection и IEnumerable.
И наконец, в классе Dictionary реализуется приведенный ниже
индексатор, определенный в интерфейсе IDictionary.
public TValue this[TKey key] { get; set; }
Этот индексатор служит для получения и установки значения элемента коллекции,
а также для добавления в коллекцию нового элемента. Но в качестве индекса в данном
случае служит ключ элемента, а не сам индекс.
При перечислении коллекции типа Dictionary из нее возвра
щаются пары "ключ-значение" в форме структуры KeyValuePair.
Напомним, что в этой структуре определяются два поля.
public TKey Key;
public TValue Value;
В этих полях содержится ключ или значение соответствующего элемента коллек
ции. Как правило, структура KeyValuePair не используется не
посредственно, поскольку средства класса Dictionary позволяют
работать с ключами и значениями по отдельности. Но при перечислении коллекции
типа Dictionary, например, в цикле foreach перечисляемыми
объектами являются пары типа KeyValuePair.
Все ключи в коллекции типа Dictionary должны быть уни
кальными, причем ключ не должен изменяться до тех пор, пока он служит в качестве
ключа. В то же время значения не обязательно должны быть уникальными. К тому же
объекты не хранятся в коллекции типа Dictionary в отсортирован
ном порядке.
В приведенном ниже примере демонстрируется применение класса
Dictionary.
// Продемонстрировать применение класса обобщенной
// коллекции Dictionary.
using System;
using System.Collections.Generic;
class GenDictionaryDemo {
static void Main() {
// Создать словарь для хранения имен и фамилий
// работников и их зарплаты.
Dictionary dict =
new Dictionary();
// Добавить элементы в коллекцию.
diet.Add("Батлер, Джон", 73000);
diet.Add("Шварц, Capa", 59000);
diet.Add("Пайк, Томас", 45000);
diet.Add("Фрэнк, Эд", 99000);
// Получить коллекцию ключей, т.е. фамилий и имен.
ICollection с = diet.Keys;
// Использовать ключи для получения значений, т.е. зарплаты.
foreach(string str in с)
Console.WriteLine("{0}, зарплата: {1:C}", str, diet[str]);
}
}
Ниже приведен результат выполнения этой программы.
Батлер, Джон, зарплата: $73,000.00
Шварц, Сара, зарплата: $59,000.00
Пайк, Томас, зарплата: $45,000.00
Фрэнк, Эд, зарплата: $99,000.00
Класс SortedDictionary
В коллекции класса SortedDictionary пары "ключ-значение"
хранятся таким же образом, как и в коллекции класса Dictionary,
за исключением того, что они отсортированы по соответствующему ключу. В клас
се SortedDictionary реализуются интерфейсы IDictionary,
IDictionary, ICollection, ICollection>, IEnumerable и IEnumerable>. В классе
SortedDictionary предоставляются также следующие конструкторы.
public SortedDictionary()
public SortedDictionary(IDictionary dictionary)
public SortedDictionary(IComparer comparer)
public SortedDictionary(IDictionary dictionary,
IComparer comparer)
В первом конструкторе создается пустой словарь, во втором конструкторе — сло
варь с указанным количеством элементов dictionary. В третьем конструкторе допу
скается указывать с помощью параметра comparer типа IComparer способ сравне
ния, используемый для сортировки, а в четвертом конструкторе — инициализировать
словарь, помимо указания способа сравнения.
В классе SortedDictionary определен ряд методов. Некоторые
наиболее часто используемые методы этого класса сведены в табл. 25.18.
Таблица 25.18. Наиболее часто используемые методы, определенные
в классе SortedDictionary
Метод Описание
public void Add(TKey key,
TValue value)
Добавляет в словарь пару "ключ-значение”,
определяемую параметрами key и value. Если
ключ key уже находится в словаре, то его значе
ние не изменяется, и генерируется исключение
ArgumentException
public bool ContainsKey(TKey
key)
Возвращает логическое значение true, если вызыва
ющий словарь содержит объект key в качестве клю
ча; в противном случае — логическое значение false
Метод Описание
public bool
ContainsValue(TValue value)
Возвращает логическое значение true, если вызы
вающий словарь содержит значение value; в про
тивном случае — логическое значение false
public bool Remove(TKey key) Удаляет ключ key из словаря. При удачном исходе
операции возвращается логическое значение true,
а если ключ key отсутствует в словаре — логическое
значение false
Кроме того, в классе SortedDictionary определяются собствен
ные свойства, помимо тех, что уже объявлены в интерфейсах, которые в нем реализу
ются. Эти свойства приведены ниже.
Следует иметь в виду, что ключи и значения, содержащиеся в коллекции, доступ
ны отдельными списками с помощью свойств Keys и Values. В коллекциях типа
SortedDictionary.KeyCollection и SortedDictionary.ValueCollection реализуются как обобщенные, так и необобщенные фор
мы интерфейсов ICollection и IEnumerable.
И наконец, в классе SortedDictionary реализуется приведен
ный ниже индексатор, определенный в интерфейсе IDictionary.
public TValue this[TKey key] { get; set; }
Этот индексатор служит для получения и установки значения элемента коллекции,
а также для добавления в коллекцию нового элемента. Но в данном случае в качестве
индекса служит ключ элемента, а не сам индекс.
При перечислении коллекции типа SortedDictionary из нее
возвращаются пары "ключ-значение" в форме структуры KeyValuePair. Напомним, что в этой структуре определяются два следующих поля.
public TKey Key;
public TValue Value;
В этих полях содержится ключ или значение соответствующего элемента коллек
ции. Как правило, структура KeyValuePair не используется не
посредственно, поскольку средства класса SortedDictionary по
зволяют работать с ключами и значениями по отдельности. Но при перечислении
коллекции типа SortedDictionary, например в цикле foreach,
перечисляемыми объектами являются пары типа KeyValuePair.
Окончание табл. 25.18
Свойство Описание
public Icomparer Comparer { get; } Получает метод сравнения для вызы
вающего словаря
public SortedDictionary.
KeyCollection Keys { get; }
Получает коллекцию ключей
public SortedDictionary.
ValueCollection Values { get; }
Получает коллекцию значений
Все ключи в коллекции типа SortedDictionary должны быть
уникальными, причем ключ не должен изменяться до тех пор, пока он служит в каче
стве ключа. В то же время значения не обязательно должны быть уникальными.
В приведенном ниже примере демонстрируется применение класса
SortedDictionary. Это измененный вариант предыдущего приме
ра, демонстрировавшего применение класса Dictionary. В данном
варианте база данных работников отсортирована по фамилии и имени работника, ко
торые служат в качестве ключа.
// Продемонстрировать применение класса обобщенной
// коллекции SortedDictionary.
using System;
using System.Collections.Generic;
class GenSortedDictionaryDemo {
static void Main() {
// Создать словарь для хранения имен и фамилий
// работников и их зарплаты.
SortedDictionary dict =
new SortedDictionary();
// Добавить элементы в коллекцию.
dict.Add("Батлер, Джон", 73000);
dict.Add("Шварц, Capa", 59000);
dict.Add("Пайк, Томас", 45000);
dict.Add("Фрэнк, Эд", 99000);
// Получить коллекцию ключей, т.е. фамилий и имен.
ICollection с = dict.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
Как видите, список работников и их зарплаты отсортированы по ключу, в качестве
которого в данном случае служит фамилия и имя работника.
Класс SortedList
В коллекции класса SortedList хранится отсортированный спи
сок пар "ключ-значение". Это обобщенный эквивалент класса необобщенной коллекции
SortedList. В классе SortedList реализуются интерфейсы IDictionary,
IDictionary, ICollection, ICollection>, IEnumerable и IEnumerable>. Размер
коллекции типа SortedList изменяется динамически, автоматически
увеличиваясь по мере необходимости. Класс SortedList подобен классу
SortedDictionary, но у него другие рабочие характеристики. В част
ности, класс SortedList использует меньше памяти, тогда как класс
SortedDictionary позволяет быстрее вставлять неупорядоченные эле
менты в коллекцию.
В классе SortedList предоставляется немало конструкторов.
Ниже перечислены наиболее часто используемые конструкторы этого класса.
public SortedList()
public SortedList(IDictionary dictionary)
public SortedList(int capacity)
public SortedList(IComparer comparer)
В первой форме конструктора создается пустой список с выбираемой по умолча
нию первоначальной емкостью. Во второй форме конструктора создается отсортиро
ванный список с указанным количеством элементов dictionary. В третьей форме
конструктора с помощью параметра capacity задается емкость коллекции, созда
ваемой в виде отсортированного списка. Если размер списка заранее известен, то, ука
зав емкость создаваемой коллекции, можно исключить изменение размера списка во
время выполнения, что, как правило, требует дополнительных затрат вычислительных
ресурсов. И в четвертой форме конструктора допускается указывать с помощью пара
метра comparer способ сравнения объектов, содержащихся в списке.
Емкость коллекции типа SortedList увеличивается автоматиче
ски по мере необходимости, когда в список добавляются новые элементы. Если теку
щая емкость коллекции превышается, то она увеличивается. Преимущество указания
емкости коллекции типа SortedList при ее создании заключает
ся в снижении или полном исключении издержек на изменение размера коллекции.
Разумеется, указывать емкость коллекции целесообразно лишь в том случае, если за
ранее известно, сколько элементов требуется хранить в ней.
В классе SortedList определяется ряд собственных методов, по
мимо тех, что уже объявлены в интерфейсах, которые в нем реализуются. Некоторые
из наиболее часто используемых методов этого класса перечислены в табл. 25.19. Сле
дует иметь в виду, что перечислитель, возвращаемый методом GetEnumerator(), слу
жит для перечисления пар "ключ-значение", хранящихся в отсортированном списке в
виде объектов типа KeyValuePair.
Таблица 25.19. Наиболее часто используемые методы, определенные
в классе SortedList
Метод Описание
public void Add(TKey key,
TValue value)
Добавляет в список пару "ключ-значение”,
определяемую параметрами key и value.
Если ключ key уже находится в списке, то его
значение не изменяется, и генерируется исклю
чение ArgumentException
public bool ContainsKey(TK key) Возвращает логическое значение true, если вы
зывающий список содержит объект key в каче
стве ключа; а иначе — логическое значение false
Окончание табл. 25.19
Кроме того, в классе SortedList определяются собственные свойства,
помимо тех, что уже объявлены в интерфейсах, которые в нем реализуются. Эти свой
ства приведены ниже.
И наконец, в классе SortedList реализуется приведенный ниже
индексатор, определенный в интерфейсе IDictionary. Это еще один измененный вариант представленного
Метод Описание
public bool
ContainsValue(TValue value)
Возвращает логическое значение true, если
вызывающий список содержит значение
value; в противном случае — логическое зна
чение false
public IEnumerator<KeyValuePair