программирование. Руководство su P# a n Reference в herbert schildt полное руководство с 0 герберт шилдт
Скачать 3.32 Mb.
|
В классе Queue определяется ряд собственных методов, помимо тех, что уже объявлены в интерфейсах, которые в нем реализуются. Некоторые из наиболее часто используемых методов этого класса перечислены в табл. 25.8. Эти методы обычно применяются следующим образом. Для того чтобы поместить объект в очередь, вызывается метод Enqueue () . Если требуется извлечь' и удалить первый объект из начала очереди, то вызывается метод Dequeue (). Если же требуется извлечь, но не удалять следующий объект из очереди, то вызывается метод Реек (). А если методы DequeueO иРеек() вызываются, когда очередь пуста, то генерируется исключение InvalidOperationException. Таблица 25.8. Наиболее часто используемые методы, определенные в классе Queue Метод Описание public virtual void Clear() public virtual bool Contains(object obj) public virtual object Dequeue() public virtual void Enqueue(object obj) Устанавливает свойство Count равным нулю, очищая, по существу, очередь Возвращает логическое значение true, если объект obj содержится в вызывающей очереди, а иначе – логическое значение false Возвращает объект из начала вызывающей очереди. Возвращаемый объект удаляется из очереди Добавляет объект obj в конец очереди Окончание табл. 25.8 Метод Описание public virtual object Peek() public static Queue Synchronized(Queue queue) public virtual object[] ToArray() public virtual void TrimToSize() Возвращает объект из начала вызывающей очереди, но не удаляет его Возвращает синхронизированный вариант коллекции типа Queue, передаваемой в качестве параметра queue Возвращает массив, который содержит копии элементов из вызывающей очереди Устанавливает значение свойства Capacity равным значению свойства Count В приведенном ниже примере программы демонстрируется применение класса Queue. // Продемонстрировать применение класса Queue. using System; using System.Collections; class QueueDemo { static void ShowEnq(Queue q, int a) { q.Enqueue(a) ; Console.WriteLine("Поместить в очередь: Enqueue(" + a + ")"); Console.Write("Содержимое очереди: "); foreach(int i in q) Console.Write(i + " "); Console.WriteLine() ; } static void ShowDeq(Queue q) { Console.Write("Извлечь из очереди: Dequeue ‑> "); int a = (int) q.Dequeue(); Console.WriteLine(a); Console.Write("Содержимое очереди: "); foreach(int i in q) Console.Write(i + " ") ; Console.WriteLine(); } static void Main() { Queue q = new Queue(); foreach(int i in q) Console.Write(i + " "); ShowEnq(q, 22); ShowEnq(q, 65); ShowEnq(q, 91); ShowDeq(q); ShowDeq(q); ShowDeq(q); try { ShowDeq (q); } catch (InvalidOperationException) { Console.WriteLine("Очередь пуста."); } } } Эта программа дает следующий результат. Поместить в очередь: Enqueue(22) Содержимое очереди: 22 Поместить в очередь: Enqueue(65) Содержимое очереди: 22 65 Поместить в очередь: Enqueue(91) Содержимое очереди: 22 65 91 Извлечь из очереди: Dequeue ‑> 22 Содержимое очереди: 65 91 Извлечь из очереди: Dequeue ‑> 65 Содержимое очереди: 91 Извлечь из очереди: Dequeue ‑> 91 Содержимое очереди: Извлечь из очереди: Dequeue ‑> Очередь пуста. Хранение отдельных битов в классе коллекции BitArray Класс BitArray служит для хранения отдельных битов в коллекции. А поскольку в коллекции этого класса хранятся биты, а не объекты, то своими возможностями он отличается от классов других коллекций. Тем не менее в классе BitArray реализуются интерфейсы ICollection и IEnumerable как основополагающие элементы поддержки всех типов коллекций. Кроме того, в классе BitArray реализуется интерфейс ICloneable. В классе BitArray определено несколько конструкторов. Так, с помощью приведенного ниже конструктора можно сконструировать объект типа BitArray из массива логических значений. public BitArray(bool[] values) В данном случае каждый элемент массива values становится отдельным битом в коллекции. Это означает, что каждому элементу массива values соответствует отдельный бит в коллекции. Более того, порядок расположения элементов в массиве values сохраняется и в коллекции соответствующих им битов. Коллекцию типа BitArray можно также составить из массива байтов, используя следующий конструктор. Здесь битами в коллекции становится уже целый их набор из массива bytes, причем элемент bytes [ 0 ] обозначает первые 8 битов, элемент bytes [ 1 ] – вторые 8 битов и т.д. Аналогично, коллекцию типа Bit Array можно составить из массива целочисленных значений, используя приведенный ниже конструктор. public BitArray(int[ ] values) В данном случае элемент values [0 ] обозначает первые 32 бита, элемент values [ 1 ] – вторые 32 бита и т.д. С помощью следующего конструктора можно составить коллекцию типа BitArray, указав ее конкретный размер: public BitArray(int length) где length обозначает количество битов в коллекции, которые инициализируются логическим значением false. В приведенном ниже конструкторе можно указать не только размер коллекции, но и первоначальное значение составляющих ее битов. public BitArray(int length, bool defaultValue) В данном случае все биты в коллекции инициализируются значением defaultValue, передаваемым конструктору в качестве параметра. И наконец, новую коллекцию типа BitArray можно создать из уже существующей, используя следующий конструктор. public BitArray(BitArray bits) Вновь сконструированный объект будет содержать такое же количество битов, как и в указываемой коллекции bits, а в остальном это будут две совершенно разные коллекции. Коллекции типа BitArray подлежат индексированию. По каждому индексу указывается отдельный бит в коллекции, причем нулевой индекс обозначает младший бит. В классе BitArray определяется ряд собственных методов, помимо тех, что уже объявлены в интерфейсах, которые в нем реализуются. Методы этого класса приведены в табл. 25.9. Обратите внимание на то, что в классе BitArray не поддерживается метод Synchronized (). Это означает, что для коллекций данного класса синхронизированная оболочка недоступна, а свойство IsSynchronized всегда имеет логическое значение false. Тем не менее для управления доступом к коллекции типа BitArray ее можно синхронизировать для объекта, предоставляемого упоминавшимся ранее свойством SyncRoot. Таблица 25.9. Методы, определенные в классе BitArray Метод Описание public value) BitArray And(BitArray Выполняет операцию логического умножения И битов вызывающего объекта и коллекции value. Возвращает коллекцию типа BitArray, содержащую результат public bool Get(int index) Возвращает значение бита, указываемого по индексу index public BitArray Not() Выполняет операцию поразрядного логического отрицания НЕ битов вызывающей коллекции и возвращает коллекцию типа BitArray, содержащую результат Метод Описание public BitArray Or(BitArray value) public void Set (int index, bool value) public void SetAll(bool value) public BitArray Xor(BitArray value) Выполняет операцию логического сложения ИЛИ битов вызывающего объекта и коллекции value. Возвращает коллекцию типа BitArray, содержащую результат Устанавливает бит, указываемый по индексу index , равным значению value Устанавливает все биты равными значению value Выполняет логическую операцию исключающее ИЛИ над битами вызывающего объекта и коллекции value. Возвращает коллекцию типа BitArray, со‑ В классе BitArray определяется также собственное свойство, помимо тех, что указаны в интерфейсах, которые в нем реализуются. public int Length { get; set; } Свойство Length позволяет установить или получить количество битов в коллекции. Следовательно, оно возвращает такое же значение, как и стандартное свойство Count, определяемое для всех коллекций. В отличие от свойства Count, свойство Length доступно не только для чтения, но и для записи, а значит, с его помощью можно изменить размер коллекции типа BitArray. Так, при сокращении коллекции типа BitArray лишние биты усекаются, начиная со старшего разряда. А при расширении коллекции типа BitArray дополнительные биты, имеющие логическое значение false, вводятся в коллекцию, начиная с того же старшего разряда. Кроме того, в классе BitArray определяется следующий индексатор. public bool this[int index] { get; set; } С помощью этого индексатора можно получать или устанавливать значение элемента. В приведенном ниже примере демонстрируется применение класса BitArray. // Продемонстрировать применение класса BitArray. using System; using System.Collections; class BADemo { public static void ShowBits(string rem, BitArray bits) { Console.WriteLine(rem); for(int i=0; i < bits.Count; i++) Console.Write("{0, ‑6} ", bits[i]); Console.WriteLine ("\n"); } static void Main() { BitArray ba = new BitArray(8); byte[] b = { 67 }; BitArray ba2 = new BitArray(b); ShowBits("Исходное содержимое коллекции Ьа:", Ьа) ; ba = Ьа.Not (); ShowBits("Содержимое коллекции Ьа после логической операции NOT:", Ьа); ShowBits("Содержимое коллекции Ьа2:", Ьа2); BitArray ЬаЗ = Ьа.Хог(Ьа2); ShowBits("Результат логической операции ba XOR Ьа2:", ЬаЗ); } } Эта программа дает следующий результат. Исходное содержимое коллекции Ьа: False False False False False False False False Содержимое коллекции ba после логической операции NOT: True True True True True True True True Содержимое коллекции ba2: True True False False False False ?True False Результат логической операции ba XOR ba2: False False True True True True False True Специальные коллекции В среде .NET Framework предусмотрен ряд специальных коллекций, оптимизированных для работы с данными конкретного типа или для их обработки особым образом. Классы этих необобщенных коллекций определены в пространстве имен System. Collections . Specialized и перечислены ниже. Класс специальной коллекции Описание CollectionsUtil Содержит фабричные методы для создания коллекций HybridDictionary Предназначен для коллекций, в которых для хранения небольшого количества пар “ключ‑значение” используется класс ListDictionary. При превышении коллекцией определенного размера автоматически используется класс Hashtable для хранения ее элементов ListDictionary Предназначен для коллекций, в которых для хранения пар “ключ‑значение" используется связный список. Такие коллекции рекомендуются только для хранения небольшого количества элементов NameValueCollection Предназначен для отсортированных коллекций, в которых хранятся пары “ключ‑значение”, причем и ключ, и значение относятся к типу string OrderedDictionary Предназначен для коллекций, в которых хранятся индексируемые пары “ключ‑значение” StringCollection Предназначен для коллекций, оптимизированных для хранения символьных строк StringDictionary Предназначен для хеш‑таблиц, в которых хранятся пары “ключ‑значение”, причем и ключ, и значение относятся к типу string Кроме того, в пространстве имен System. Collections определены три базовых абстрактных класса: CollectionBase, ReadOnlyCollectionBase и DictionaryBase. Эти классы могут наследоваться и служить в качестве отправной точки для разработки собственных специальных коллекций. Обобщенные коллекции Благодаря внедрению обобщений прикладной интерфейс Collections API значительно расширился, в результате чего количество классов коллекций и интерфейсов удвоилось. Обобщенные коллекции объявляются в пространстве имен System. Collections . Generic. Как правило, классы обобщенных коллекций являются не более чем обобщенными эквивалентами рассматривавшихся ранее классов необобщенных коллекций, хотя это соответствие не является взаимно однозначным. Например, в классе обобщенной коллекции LinkedList реализуется двунаправленный список, тогда как в необобщенном эквиваленте его не существует. В некоторых случаях одни и те же функции существуют параллельно в классах обобщенных и необобщенных коллекций, хотя и под разными именами. Так, обобщенный вариант класса ArrayList называется List, а обобщенный вариант класса HashTable – Dictionary. Кроме того, конкретное содержимое различных интерфейсов и классов реорганизуется с минимальными изменениями для переноса некоторых функций из одного интерфейса в другой. Но в целом, имея ясное представление о необобщенных коллекциях, можно без особого труда научиться применять и обобщенные коллекции. Как правило, обобщенные коллекции действуют по тому же принципу, что и‑необобщенные, за исключением того, что обобщенные коллекции типизированы. Это означает, что в обобщенной коллекции можно хранить только те элементы, которые совместимы по типу с ее аргументом. Так, если требуется коллекция для хранения несвязанных друг с другом разнотипных данных, то для этой цели следует использовать классы необобщенных коллекций. А во всех остальных случаях, когда в коллекции должны храниться объекты только одного типа, выбор рекомендуется останавливать на классах обобщенных коллекций. Обобщенные коллекции определяются в ряде интерфейсов и классов, реализующих эти интерфейсы. Все они описываются далее по порядку. Интерфейсы обобщенных коллекций В пространстве имен System. Collections. Generic определен целый ряд интерфейсов обобщенных коллекций, имеющих соответствующие аналоги среди интерфейсов необобщенных коллекций. Все эти интерфейсы сведены в табл. 25.10. Таблица 25.10. Интерфейсы обобщенных коллекций Интерфейс Описание lCollection коллекций 1Сотрагег<т> Определяет обобщенный метод Compare () для сравнения объектов, хранящихся в коллекции lDictionary “ключ‑значение" Окончание табл. 25.10 Интерфейс Описание IEnumerable Определяет обобщенный метод GetEnumerator (), ‑ предоставляющий перечислитель для любого класса коллекции Enumerator Предоставляет методы, позволяющие получать содержи мое коллекции по очереди IEqualityComparer Сравнивает два объекта на предмет равенства IList Определяет обобщенную коллекцию, доступ к которой можно получить с помощью индексатора Интерфейс ICollection В интерфейсе ICollection Итак, в интерфейсе ICollection int Count { get; } bool IsReadOnly { get; } Свойство Count содержит ряд элементов, хранящихся в данный момент в коллекции. А свойство IsReadOnly имеет логическое значение true, если коллекция доступна только для чтения. Если же коллекция доступна как для чтения, так и для записи, то данное свойство имеет логическое значение false. Кроме того, в интерфейсе ICollection Метод Описание |