Полное руководство. С# 4.0 - Шилдт Герберт
Шрифт:
Интервал:
Закладка:
> GetEnumerator()Возвращает перечислитель для вызывающегословаряpublic int IndexOfKey(TKey key) Возвращает индекс ключа key. Если искомыйключ не обнаружен в списке, возвращаетсязначение -1public int IndexOfValue(TValuevalue)Возвращает индекс первого вхождения значения value в вызывающем списке. Если искомое значение не обнаружено в списке, возвращается значение -1public bool Remove(TKey key) Удаляет из списка пару “ключ-значение” поуказанному ключу key. При удачном исходеоперации возвращается логическое значениеtrue, а если ключ key отсутствует в списке —логическое значение falsepublic void RemoveAt(int index) Удаляет из списка пару “ключ-значение" по указанному индексу indexpublic void TrimExcess() Сокращает избыточную емкость вызывающейколлекции в виде отсортированного спискаСвойство Описаниеpublic int Capacity { get; set; } Получает или устанавливает емкостьвызывающей коллекции в виде отсортированного спискаpublic IComparer Comparer { get; } Получает метод сравнения для вызывающего спискаpublic IList Keys { get; } Получает коллекцию ключейpublic IList Values { get; } Получает коллекцию значенийранее примера базы данных работников. В данном варианте база данных хранится вколлекции типа SortedList.// Продемонстрировать применение класса обобщенной// коллекции SortedList.using System;using System.Collections.Generic;class GenSLDemo {static void Main() {// Создать коллекцию в виде отсортированного списка// для хранения имен и фамилий работников и их зарплаты.SortedList sl =new SortedList();// Добавить элементы в коллекцию.sl.Add("Батлер, Джон", 73000);sl.Add("Шварц, Capa", 59000);sl.Add("Пайк, Томас", 45000);sl.Add("Фрэнк, Эд", 99000);// Получить коллекцию ключей, т.е. фамилий и имен.ICollection с = 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Класс Stack является обобщенным эквивалентом класса необобщенной коллекции Stack. В нем поддерживается стек в виде списка, действующего по принципу"первым пришел — последним обслужен". В этом классе реализуются интерфейсыCollection, IEnumerable и IEnumerable. Кроме того, в классе Stack непосредственно реализуются методы Clear(), Contains() и СоруТо(), определенные винтерфейсе ICollection. А методы Add() и Remove() в этом классе не поддерживаются, как, впрочем, и свойство IsReadOnly. Коллекция класса Stack имеетдинамический характер, расширяясь по мере необходимости, чтобы вместить все элементы, которые должны в ней храниться. В классе Stack определяются следующиеконструкторы.public Stack()public Stack(int capacity)public Stack(IEnumerable collection)В первой форме конструктора создается пустой стек с выбираемой по умолчаниюпервоначальной емкостью, а во второй форме — пустой стек, первоначальный размеркоторого определяет параметр сараcity. И в третьей форме создается стек, содержащий элементы коллекции, определяемой параметром collection. Его первоначальная емкость равна количеству указанных элементов.В классе Stack определяется ряд собственных методов, помимо тех, чтоуже объявлены в интерфейсах, которые в нем реализуются, а также в интерфейсеICollection. Некоторые из наиболее часто используемых методов этого класса перечислены в табл. 25.20. Как и в классе Stack, эти методы обычно применяютсяследующим образом. Для того чтобы поместить объект на вершине стека, вызываетсяметод Push(). А для того чтобы извлечь и удалить объект из вершины стека, вызывается метод Pop(). Если же объект требуется только извлечь, но не удалить из вершиныстека, то вызывается метод Рееk(). А если вызвать метод Pop() или Рееk(), когда вызывающий стек пуст, то сгенерируется исключение InvalidOperationException.Таблица 25.20. Методы, определенные в классе StackВ приведенном ниже примере программы демонстрируется применение классаStack.// Продемонстрировать применение класса Stack.using System;using System.Collections.Generic;class GenStackDemo {static void Main() {Stack st = new Stack();st.Push("один");st.Push("два");st.Push("три");st.Push("четыре");st.Push("пять");while(st.Count > 0) {string str = st.Pop();Метод Описаниеpublic T Peek() Возвращает элемент, находящийся на вершине стека,но не удаляет егоpublic T Pop() Возвращает элемент, находящийся на вершине стека,удаляя его в процессе работыpublic void Push(T item) Помещает элемент item в стекpublic T[] ToArray() Возвращает массив, содержащий копии элементов вызывающего стекаpublic void TrimExcess() Сокращает избыточную емкость вызывающей коллекциив виде стекаConsole.Write(str + " ");}Console.WriteLine();}}При выполнении этой программы получается следующий результат.пять четыре три два одинКласс QueueКласс Queue является обобщенным эквивалентом класса необобщенной коллекции Queue. В нем поддерживается очередь в виде списка, действующего по принципу "первым пришел — первым обслужен". В этом классе реализуются интерфейсыICollection, IEnumerable и IEnumerable. Кроме того, в классе Queue непосредственно реализуются методы Clear(), Contains() и CopyTo(), определенные в интерфейсе ICollection. А методы Add() и Remove() в этом классе неподдерживаются, как, впрочем, и свойство IsReadOnly. Коллекция класса Queueимеет динамический характер, расширяясь по мере необходимости, чтобы вместитьвсе элементы, которые должны храниться в ней. В классе Queue определяются следующие конструкторы.public Queue()public Queue(int capacity)public Queue(IEnumerable collection)В первой форме конструктора создается пустая очередь с выбираемой по умолчанию первоначальной емкостью, а во второй форме — пустая очередь, первоначальныйразмер которой определяет параметр capacity. И в третьей форме создается очередь,содержащая элементы коллекции, определяемой параметром collection. Ее первоначальная емкость равна количеству указанных элементов.В классе Queue определяется ряд собственных методов, помимо тех, чтоуже объявлены в интерфейсах, которые в нем реализуются, а также в интерфейсе ICollection. Некоторые из наиболее часто используемых методов этогокласса перечислены в табл. 25.21. Как и в классе Queue, эти методы обычно применяются следующим образом. Для того чтобы поместить объект в очередь, вызывается метод Enqueue(). Если требуется извлечь и удалить первый объект из началаочереди, то вызывается метод Dequeue(). Если же требуется извлечь, но не удалять следующий объект из очереди, то вызывается метод Рееk(). А если методыDequeue() и Рееk() вызываются, когда очередь пуста, то генерируется исключениеInvalidOperationException.Таблица 25.21. Методы, определенные в классе QueueМетод Описаниеpublic Т Dequeue() Возвращает объект из начала вызывающей очереди.Возвращаемый объект удаляется из очередиpublic void Enqueue(Т item)public T Peek()Добавляет элемент item в конец очередиВозвращает элемент из начала вызывающей очереди, но не удаляет егоОкончание табл. 25.21Метод Описаниеpublic virtual Т[]ToArray()Возвращает массив, который содержит копии элементов из вызывающей очередиpublic void TrimExcess() Сокращает избыточную емкость вызывающей коллекции в виде очередиВ приведенном ниже примере демонстрируется применение класса Queue.// Продемонстрировать применение класса Queue.using System;using System.Collections.Generic;class GenQueueDemo {static void Main() {Queue q = new Queue();q.Enqueue(98.6);q.Enqueue(212.0);q.Enqueue(32.0);q.Enqueue(3.1416);double sum = 0.0;Console.Write("Очередь содержит: ");while(q.Count > 0) {double val = q. Dequeued;Console.Write(val + " ");sum += val;}Console.WriteLine("nИтоговая сумма равна " + sum);}}Вот к какому результату приводит выполнение этой программы.Очередь содержит: 98.6 212 32 3.1416Итоговая сумма равна 345.7416Класс HashSetВ классе HashSet поддерживается коллекция, реализующая множество.Для хранения элементов этого множества в нем используется хеш-таблица. В классе HashSet реализуются интерфейсы ICollection, ISet, IEnumerable,IEnumerable, ISerializable, а также IDeserializationCallback. В коллекции типа HashSet реализуется множество, все элементы которого являются уникальными. Иными словами, дубликаты в таком множестве не допускаются. Порядокследования элементов во множестве не указывается. В классе HashSet определяется полный набор операций с множеством, определенных в интерфейсе ISet, включая пересечение, объединение и разноименность. Благодаря этому класс HashSetоказывается идеальным средством для работы с множествами объектов, когда порядокрасположения элементов во множестве особого значения не имеет. Коллекция типаHashSet имеет динамический характер и расширяется по мере необходимости,чтобы вместить все элементы, которые должны в ней храниться.Ниже перечислены наиболее употребительные конструкторы, определенные вклассе HashSet.public HashSet()public HashSet(IEnumerable collection)public HashSet(IEqualityCompare comparer)public HashSet(IEnumerable collection, IEqualityCompare comparer)В первой форме конструктора создается пустое множество, а во второй форме —множество, состоящее из элементов указываемой коллекции collection. В третьейформе конструктора допускается указывать способ сравнения с помощью параметраcomparer. А в четвертой форме создается множество, состоящее из элементов указываемой коллекции collection, и используется заданный способ сравнения comparer.Имеется также пятая форма конструктора данного класса, в которой допускается инициализировать множество последовательно упорядоченными данными.В классе HashSet реализуется интерфейс ISet, а следовательно, в нем предоставляется полный набор операций со множествами. В этом классе предоставляетсятакже метод RemoveWhere(), удаляющий из множества элементы, не удовлетворяющие заданному условию, или предикату.Помимо свойств, определенных в интерфейсах, которые реализуются в классеHashSet, в него введено дополнительное свойство Comparer, приведенное ниже.public IEqualityComparer Comparer { get; }Оно позволяет получать метод сравнения для вызывающего хеш-множества.Ниже приведен конкретный пример применения класса HashSet.// Продемонстрировать применение класса HashSet.using System;using System.Collections.Generic;class HashSetDemo {static void Show(string msg, HashSet set) {Console.Write(msg);foreach(char ch in set)Console.Write(ch + " ");Console.WriteLine();}static void Main() {HashSet setA = new HashSet();HashSet setB = new HashSet();setA.Addf'A');setA.Add('B');setA.Add('С');setB.Add('C');setB.Add('D');setB.Add('Е');Show("Исходное содержимое множества setA: ", setA);Show("Исходное содержимое множества setB: ", setB);setA.SymmetricExceptWith(setB);Show("Содержимое множества setA после " +"разноименности со множеством SetB: ", setA);setA.UnionWith(setB);Show("Содержимое множества setA после " +"объединения со множеством SetB: ", setA);setA.ExceptWith(setB);Show("Содержимое множества setA после " +"вычитания из множества setB: ", setA);Console.WriteLine();}}Ниже приведен результат выполнения программы из данного примера.Исходное содержимое множества setA: A B CИсходное содержимое множества setB: С D ЕСодержимое множества setA после разноименности со множеством SetB: А В D ЕСодержимое множества setA после объединения со множеством SetB: А В D Е ССодержимое множества setA после вычитания из множества setB: А ВКласс SortedSetКласс SortedSet представляет собой новую разновидность коллекции,введенную в версию 4.0 среды .NET Framework. В нем поддерживается коллекция, реализующая отсортированное множество. В классе SortedSet реализуются интерфейсы ISet, ICollection, ICollection, IEnumerable,IEnumerable, ISerializable, а также IDeserializationCallback. В коллекции типа SortedSet реализуется множество, все элементы которого являютсяуникальными. Иными словами, дубликаты в таком множестве не допускаются. В классе SortedSet определяется полный набор операций с множеством, определенныхв интерфейсе ISet, включая пересечение, объединение и разноименность. Благодаря тому что все элементы коллекции типа SortedSet сохраняются в отсортированном порядке, класс SortedSet оказывается идеальным средством для работыс отсортированными множествами объектов. Коллекция типа SortedSet имеетдинамический характер и расширяется по мере необходимости, чтобы вместить всеэлементы, которые должны в ней храниться.Ниже перечислены четыре наиболее часто используемые конструктора, определенных в классе SortedSet.public SortedSet()public SortedSet(IEnumerable collection)public SortedSet(IComparer comparer)public SortedSet(IEnumerable collection, IComparer comparer)В первой форме конструктора создается пустое множество, а во второй форме —множество, состоящее из элементов указываемой коллекции collection. В третьейформе конструктора допускается указывать способ сравнения с помощью параметраcomparer. А в четвертой форме создается множество, состоящее из элементов указываемой коллекции collection, и используется заданный способ сравнения comparer.Имеется также пятая форма конструктора данного класса, в которой допускается инициализировать множество последовательно упорядоченными данными.В классе SortedSet реализуется интерфейс ISet, а следовательно, в немпредоставляется полный набор операций со множествами. В этом классе предоставляется также метод GetViewBetween(), возвращающий часть множества в форме объекта типа SortedSet, метод RemoveWhere(), удаляющий из множества элементы,не удовлетворяющие заданному условию, или предикату, а также метод Reverse(),возвращающий объект типа IEnumerable, который циклически проходит множество в обратном порядке.Помимо свойств, определенных в интерфейсах, которые реализуются в классеSortedSet, в него введены дополнительные свойства, приведенные ниже.public IComparer Comparer { get; }public T Max { get; }public T Min { get; }Свойство Comparer получает способ сравнения для вызывающего множества. Свойство Мах получает наибольшее значение во множестве, а свойство Min — наименьшеезначение во множестве.В качестве примера применения класса SortedSet на практике просто замените обозначение HashSet на SortedSet в исходном коде программы из предыдущегоподраздела, посвященного коллекциям типа HashSet.Параллельные коллекцииВ версию 4.0 среды .NET Framework добавлено новое пространство имен System.Collections.Concurrent. Оно содержит коллекции, которые являются потокобезопасными и специально предназначены для параллельного программирования. Этоозначает, что они могут безопасно использоваться в многопоточной программе, гдевозможен одновременный доступ к коллекции со стороны двух или больше параллельно исполняемых потоков. Ниже перечислены классы параллельных коллекций.Параллельная коллекция ОписаниеBlockingCollection Предоставляет оболочку для блокирующей реализации интерфейса IProducerConsumerCollectionConcurrentBag Обеспечивает неупорядоченную реализацию интерфейсаIProducerConsumerCollection, которая оказывается наиболее пригодной в том случае, когда информация вырабатывается и потребляется в одном потокеConcurrentDictionary