Выбрать главу
ледовать по ссылкам в обратном направлении: "); 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