KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Программирование » Герберт Шилдт - C# 4.0: полное руководство

Герберт Шилдт - C# 4.0: полное руководство

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Герберт Шилдт, "C# 4.0: полное руководство" бесплатно, без регистрации.
Перейти на страницу:

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

В классе SortedList<TKey, 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) - Возвращает логическое значение true, если вызывающий список содержит значение value; в противном случае — логическое значение false

public IEnumerator<KeyValuePair CTKey, TValue>> GetEnumerator() - Возвращает перечислитель для вызывающего словаря

 public int IndexOfKey(TKey key) - Возвращает индекс ключа key. Если искомый ключ не обнаружен в списке, возвращается значение -1

public int IndexOfValue(TValue value) - Возвращает индекс первого вхождения значения value в вызывающем списке. Если искомое значение не обнаружено в списке, возвращается значение -1

public bool Remove(TKey key) - Удаляет из списка пару “ключ-значение” по указанному ключу key. При удачном исходе операции возвращается логическое значение true, а если ключ key отсутствует в списке — логическое значение false

public void RemoveAt(int index) - Удаляет из списка пару “ключ-значение” по указанному индексу index

public void TrimExcess() -  Сокращает избыточную емкость вызывающей коллекции в виде отсортированного списка


Кроме того, в классе 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, TValue>


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


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

В приведенном ниже примере демонстрируется применение класса SortedList<TKey, TValue> Это еще один измененный вариант представленного ранее примера базы данных работников. В данном варианте база данных хранится в коллекции типа SortedList.


// Продемонстрировать применение класса обобщенной

// коллекции SortedList<TKey, TValue>.

using System;

using System.Collections.Generic;


class GenSLDemo {

  static void Main() {

    // Создать коллекцию в виде отсортированного списка

    // для хранения имен и фамилий работников и их зарплаты.

    SortedList<string, double> sl =

         new SortedList<string, double>();


    // Добавить элементы в коллекцию,

    sl.Add("Батлер, Джон", 73000);

    sl.Add("Шварц, Capa", 59000);

    sl.Add("Пайк, Томас", 45000);

    sl.Add("Фрэнк, Эд", 99000);


    // Получить коллекцию ключей, т.е. фамилий и имен.

    ICollection<string> с = sl.Keys;


    // Использовать ключи для получения значений, т.е. зарплаты,

    foreach(string str in с)

      Console.WriteLine("{0}, зарплата: {1:C}", str, sl[str]);


    Console.WriteLine();

  }

}


Ниже приведен результат выполнения этой программы.


Батлер, Джон, зарплата: $73,000.00

Пайк, Томас, зарплата: $45,000.00

Фрэнк, Эд, зарплата: $99,000.00

Шварц, Сара, зарплата: $59,000.00


Как видите, список работников и их зарплаты отсортированы по ключу, в качестве которого в данном случае служит фамилия и имя работника.


Класс Stack<T>

Класс Stack<T> является обобщенным эквивалентом класса необобщенной коллекции Stack. В нем поддерживается стек в виде списка, действующего по принципу "первым пришел — последним обслужен". В этом классе реализуются интерфейсы Collection, IEnumerable и IEnumerable<T>. Кроме того, в классе Stack<T> непосредственно реализуются методы Clear(),Contains() и СоруТо(), определенные в интерфейсе ICollection<T>. А методы Add() и Remove() в этом классе не поддерживаются, как, впрочем, и свойство IsReadOnly. Коллекция класса Stack<T> имеет динамический характер, расширяясь по мере необходимости, чтобы вместить все элементы, которые должны в ней храниться. В классе Stack<T> определяются следующие конструкторы.


public Stack()

public Stack(int capacity)

public Stack(IEnumerable<T> collection)


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

В классе Stack<T> определяется ряд собственных методов, помимо тех, что уже объявлены в интерфейсах, которые в нем реализуются, а также в интерфейсе ICollection<T>. Некоторые из наиболее часто используемых методов этого класса перечислены в табл.25.20. Как и в классе Stack, эти методы обычно применяются следующим образом. Для того чтобы поместить объект на вершине стека, вызывается метод Push(). А для того чтобы извлечь и удалить объект из вершины стека, вызывается метод Pop(). Если же объект требуется только извлечь, но не удалить из вершины стека, то вызывается метод Реек(). А если вызвать метод Pop() или Реек(), когда вызывающий стек пуст, то сгенерируется исключение InvalidOperationException.


Таблица 25.20. Методы, определенные в классе Stack<T>

Метод - Описание


public T Peek() - Возвращает элемент, находящийся на вершине стека, но не удаляет его

public T Pop() - Возвращает элемент, находящийся на вершине стека, удаляя его в процессе работы

public void Push(T item) - Помещает элемент item в стек

Public T[] ToArray() - Возвращает массив, содержащий копии элементов вызывающего стека

public void TrimExcess() - Сокращает избыточную емкость вызывающей коллекции в виде стека


В приведенном ниже примере программы демонстрируется применение класса Stack<T>.


// Продемонстрировать применение класса Stack<T>.

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*