Главная страница

программирование. Руководство su P# a n Reference в herbert schildt полное руководство с 0 герберт шилдт


Скачать 3.32 Mb.
НазваниеРуководство su P# a n Reference в herbert schildt полное руководство с 0 герберт шилдт
Анкорпрограммирование
Дата25.01.2022
Размер3.32 Mb.
Формат файлаrtf
Имя файлаc-40-polnoe-rukovodstvo-2011.rtf
ТипРуководство
#341448
страница85 из 97
1   ...   81   82   83   84   85   86   87   88   ...   97

В классе 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 является обобщенным вариантом необобщенного интерфейса icollection, хотя между ними имеются некоторые отличия.

Итак, в интерфейсе ICollection определены следующие свойства.

int Count { get; } bool IsReadOnly { get; }

Свойство Count содержит ряд элементов, хранящихся в данный момент в коллекции. А свойство IsReadOnly имеет логическое значение true, если коллекция доступна только для чтения. Если же коллекция доступна как для чтения, так и для записи, то данное свойство имеет логическое значение false.

Кроме того, в интерфейсе ICollection определены перечисленные ниже методы. Обратите внимание на то, что в этом обобщенном интерфейсе определено несколько большее количество методов, чем в его необобщенном аналоге.
Метод
Описание
1   ...   81   82   83   84   85   86   87   88   ...   97


написать администратору сайта