Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

lec

.pdf
Скачиваний:
24
Добавлен:
24.03.2015
Размер:
3.43 Mб
Скачать

Интерфейс ICollection

Интерфейс ICollection является фундаментом, на котором построены все коллекции. Он наследует интерфейс IEnumerable.

ICollection

IEnumerable

рис.2

В интерфейсе ICollection определены следующие свойства:

 

Свойство

 

 

 

Описание

 

 

 

 

 

 

 

 

 

int Count { get; }

 

 

 

Количество элементов коллекции в дан-

 

 

 

 

ный момент

 

 

 

 

 

 

 

 

 

 

 

Принимает значение true, если коллек-

 

bool IsSynchronized

ция синхронизирована, и значение false в

 

{ get; }

 

 

противном случае. По умолчанию коллек-

 

 

 

 

ции не синхронизированы. Но для большин-

 

 

 

 

ства коллекций можно получить синхрони-

 

 

 

 

зированную версию

 

object SyncRoot

 

 

 

Объект, для которого коллекция может

 

 

{ get; }

 

 

быть синхронизирована

 

 

 

 

 

 

 

 

 

Методы интерфейса ICollection:

 

Метод

 

 

 

Описание

 

 

 

 

 

 

 

 

 

void CopyTo (

 

 

 

Метод копирует содержимое коллекции

 

 

Array

tar-

 

в массив target, начиная с индекса

 

 

get,

 

 

 

startIdx.

 

 

int

star-

 

 

 

 

tIdx);

 

 

 

 

 

 

 

 

 

 

Метод возвращает перечислитель кол-

 

 

IEnumerator

 

 

 

лекции (задан интерфейсом IEnumerable).

 

 

GetEnumerator();

 

 

 

 

Интерфейс IList

 

 

 

 

 

IList

 

ICollection

 

IEnumerable

 

 

 

 

 

 

 

рис.3

 

 

Интерфейс IList наследует интерфейс ICollection и определяет поведение коллекции, доступ к элементам которой разрешен посредством индекса с отсчетом от нуля.

Помимо методов, определенных в интерфейсе ICollection, интерфейс IList определяет и собственные методы (они сведены в табл.).

231

Некоторые из этих методов служат для модификации коллекции. Если же коллекция предназначена только для чтения или имеет фиксированный размер, вызов этих методов приведет к генерированию исключения типа NotSupportedException.

Методы, определенные в интерфейсе IList

Метод

 

Описание

 

int

Add (object

 

Добавляет объект obj в вызывающую кол-

obj)

 

 

лекцию. Возвращает индекс, по которому этот

 

 

 

объект сохранен.

 

void Clear ( )

 

Удаляет все элементы из вызывающей кол-

 

 

 

лекции.

 

 

 

 

 

 

 

 

bool Contains (

 

Возвращает значение true, если вызываю-

 

object

 

щая коллекция содержит объект, переданный

obj)

 

 

в параметре obj, и значение false в противном

 

 

 

случае.

 

 

 

 

 

 

 

 

int IndexOf (

 

Возвращает индекс объекта obj, если он

 

object

 

(объект) содержится в вызывающей коллек-

obj)

 

 

ции. Если объект obj не обнаружен, метод

 

 

 

возвращает -1.

 

 

 

 

 

 

 

void

Insert (int

 

Вставляет в вызывающую коллекцию объ-

idx,

 

 

ект obj по индексу, заданному параметром idx.

 

object

 

Элементы, находившиеся до этого по индексу

obj)

 

 

idx и далее, смещаются вперед, чтобы освобо-

 

 

 

дить место для вставляемого объекта obj.

 

 

 

 

 

 

void Remove

 

Удаляет первое вхождение объекта obj из

 

(object

 

вызывающей коллекции. Элементы, находив-

obj)

 

 

шиеся до этого за удаленным элементом, сме-

 

 

 

щаются назад, чтобы ликвидировать образо-

 

 

 

вавшуюся "брешь".

 

 

 

 

 

 

 

void RemoveAt (

 

Удаляет из вызывающей коллекции объект,

 

int

 

расположенный по индексу, заданному пара-

idx)

 

 

метром idx. Элементы, находившиеся до этого

 

 

 

за удаленным элементом, смещаются назад,

 

 

 

чтобы

ликвидировать

образовавшуюся

 

 

 

"брешь".

 

 

Свойства и индексатор интерфейса IList

Свойства и ин-

 

Описание

дексатор

 

 

bool IsFixedSize

 

true - означает, что в такую коллекцию

{ get; }

 

нельзя вставлять элементы и удалять их из

 

 

нее.

232

bool IsReadOnly

 

true - содержимое коллекции изменению

{ get; }

 

не подлежит.

 

 

 

object this[int idx]

 

Считывание или запись значения элемента

{ get; set; }

 

с индексом idx. Нельзя добавлять новые эле-

 

 

менты

Интерфейс IDictionary

Коллекция, которая реализует интерфейс IDictionary, служит для хранения пар ключ/значение.

Сохраненную однажды пару можно затем извлечь по заданному ключу. Интерфейс IDictionary наследует интерфейс ICollection.

 

IDictionary

 

 

 

ICollection

 

 

IEnumerable

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

рис.4

 

 

 

 

 

Методы, определенные в интерфейсе IDictionary

 

 

 

 

 

Метод

 

 

Описание

 

 

 

 

 

void Add (object key,

 

 

Добавляет в вызывающую коллекцию

 

 

object v)

 

 

пару ключ/значение, заданную парамет-

 

 

 

 

 

 

 

рами key и v. Ключ key не должен быть

 

 

 

 

 

 

 

нулевым. Если окажется, что ключ key

 

 

 

 

 

 

 

уже хранится в коллекции, генерируется

 

 

 

 

 

 

 

исключение типа ArgumentException.

 

 

void Clear()

 

 

Удаляет все пары ключ/значение из

 

 

 

 

 

 

 

 

вызывающей коллекции.

 

 

 

bool Contains (

 

 

Возвращает значение true, если вы-

 

 

object key)

 

зывающая коллекция

содержит объект

 

 

 

 

 

 

 

key в качестве ключа. В противном слу-

 

 

 

 

 

 

 

чае возвращает значение false.

 

 

iDictionaryEnumerator

 

Возвращает перечислитель для вы-

 

 

 

GetEnumerator( )

 

зывающей коллекции.

 

 

 

 

 

void Remove (

 

 

Удаляет элемент, ключ которого ра-

 

 

 

object key)

 

вен значению key

 

 

 

 

 

В интерфейсе IDictionary определены следующие свойства:

 

 

Свойство

 

 

Описание

 

 

 

 

 

bool isFixedsize

 

 

Равно значению true, если словарь имеет

 

 

 

{ get; }

 

фиксированный размер.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

bool isReadOniy

 

 

Равно значению true, если словарь пред-

 

 

 

{ get; }

 

назначен только для чтения.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

iCollection Keys

 

 

Получает коллекцию ключей

 

 

 

{ get; }

 

 

 

 

 

 

 

 

 

 

iCollection Values

 

 

Получает коллекцию значений.

 

 

 

{ get; }

 

 

 

 

 

 

 

 

 

233

С помощью свойств Keys и Values ключи и значения, хранимые в словарной коллекции, можно получить в виде отдельных списков.

В интерфейсе IDictionary определен следующий индексатор: object this [object key] { get; set; }

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

Интерфейс IDictionaryEnumerator

Класс коллекции, который реализует интерфейс IDictionary, предназначен для хранения пар ключ/значение. Для опроса элементов в такой коллекции используется интерфейс IDictionaryEnumerator, а не lEnumerator.

Класс IDictionaryEnumerator является производным от класса lEnumerator и дополнительно определяет "свои" три свойства. Первое объявляется так:

DictionaryEntry Entry { get; }

Два остальные свойства интерфейса IDictionaryEnumerator:

object

Key { get; }

object

Value { get; }

Свойство Entry с помощью перечислителя позволяет получить следующую пару ключ/значение в форме структуры типа DictionaryEntry.

Пример.

Hashtable ht = new Hashtable();

ht.Add ("Анатолий", "555-3456"); ht.Add ("Александр", "555-3452");

IDictionaryEnumerator etr = ht.GetEnumerator(); while (etr.MoveNext())

Console.WriteLine(etr.Entry.Key + ": " + etr.Entry.Value);

Структура DictionaryEntry

Коллекции, в которых хранятся пары ключ/значение, используют для их хранения объект типа DictionaryEntry.

В этой структуре определены следующие свойства:

public

object

Key { get; set; }

public

object

Value { get; set; }

Эти свойства используются для получения доступа к ключу или к соответствующему ему значению.

234

Объект типа DictionaryEntry можно создать с помощью следующего конструктора:

public DictionaryEntry (object key, object value)

Здесь параметр key принимает ключ, а параметр value — значение.

Интерфейс IComparer

Этот интерфейс можно использовать для задания способа сортировки элементов коллекции. В интерфейсе IComparer определен метод Compare(), который позволяет сравнивать два объекта:

int Compare (object v1, object v2)

Метод Compare() возвращает положительное число, если значение v1>v2, отрицательное, если v1<v2, и нуль, если v1=v2.

Интерфейс IHashCodeProvider

Интерфейс IHashCodeProvider должен быть реализован коллекцией, если программисту необходимо определить собственную версию метода

GetHashCode(). По умолчанию используется метод Object.GetHashCode().

235

 

 

 

КОЛЛЕКЦИИ

 

1. Классы коллекций общего назначения

 

 

 

 

Класс

 

 

Описание

ArrayList

 

 

Динамический массив, т.е. массив который при

 

 

 

необходимости может увеличивать свой размер.

 

 

 

 

Hashtable

 

 

Хеш-таблица (словарь) для пар ключ/значение.

 

 

 

 

Queue

 

 

Очередь, или список, действующий по принципу:

 

 

 

первым прибыл — первым обслужен.

 

 

 

 

SortedList

 

 

Отсортированный список пар ключ/значение.

 

 

 

 

Stack

 

 

Стек, или список, действующий по принципу:

 

 

 

первым прибыл — последним обслужен.

 

 

 

 

Класс ArrayList

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

Класс ArrayList реализует интерфейсы:

ICollection,

IList,

lEnumerable,

ICloneable.

//Демонстрация использования ArrayList-массива.

using System;

using System.Collections;

class ArrayListDemp

{

public static void Main()

{

ArrayList al = new ArrayList(); // Создаем динамический массив.

//Добавляем элементы в динамический массив. al.Add('C');

al.Add('A');

al.Add('E');

//Отображаем массив, используя индексацию. for (int i = 0; i < al.Count; i++)

Console.Write(al[i] + " ");

al.Remove('A');

// Удаляем элемент

al[0] = 'Y';

// Изменяем элементы

al[1] = 'X';

 

236

al.Sort();

// Сортировка массива

foreach (char сh in al) Console.Write(сh + " ");

Console.WriteLine("Индекс элемента 'Y' равен " + al.BinarySearch('Y')); // поиск элемента

// Создаем обычный массив из динамического. char[] ia = (char[])al.ToArray (typeof(char));

}

}

Класс Queue

Добавление элементов в очередь и удаление их из нее осуществляется по принципу "первым пришел — первым обслужен" (first-in, first-out— FIFO).

Очередь — это динамическая коллекция, которая при необходимости увеличивается, чтобы принять для хранения новые элементы.

Класс Queue реализует интерфейсы:

ICollection (здесь определено свойство int Count {get;} ),

lEnumerable,

ICloneable.

Методы, определенные в классе Queue

Метод

Описание

 

public virtual

Возвращает

значение true, если

bool Contains(object v)

объект v содержится в вызывающей

 

очереди. В противном случае возвра-

 

щает значение false

Public virtual void Clear()

Устанавливает свойство Count рав-

 

ным нулю, тем самым эффективно

 

очищая очередь

 

public virtual

Возвращает объект из начала вы-

object Dequeue()

зывающей очереди, Возвращаемый

 

объект из очереди удаляется

public virtual

Добавляет объект v в конец очере-

void Enqueue(object v)

ди

 

public virtual

Возвращает объект из начала вы-

object Peek ( )

зывающей очереди, но не удаляет его

 

 

 

public static Queue

Возвращает

синхронизированную

Synchronized(Queue q)

версию очереди, заданной параметром

 

q

 

public virtual

Возвращает массив, который со-

object[ ] ToArray ( )

держит копии элементов из вызываю-

 

щей очереди

 

public virtual

Устанавливает свойство capacity

void TrimToSlze( )

равным значению свойства Count

237

// Демонстрация класса Queue. using System;

using System.Collections;

class QueueDemo

{

public static void Main()

{

int a;

Queue q = new Queue();

q.Enqueue(22);

q.Enqueue(65);

q.Enqueue(91);

foreach (int i in q) Console.Write(i + " ");

Console.WriteLine();

try

{

a = (int)q.Dequeue(); Console.WriteLine(a); a = (int)q.Dequeue(); Console.WriteLine(a); a = (int)q.Dequeue(); Console.WriteLine(a); a = (int)q.Dequeue(); Console.WriteLine(a);

}

catch (InvalidOperationException)

{

Console.WriteLine("Очередь пуста.");

}

}

}

Класс Hashtable

Класс Hashtable предназначен для создания коллекции, в которой для хранения объектов используется хеш-таблица. В хеш-таблице для хранения информации используется механизм, именуемый хешированием (hashing), Суть хеширования состоит в том, что для определения уникального значения, которое, называется хеш-кодом, используется информационное содержимое соответствующего ему ключа. Хеш-код затем используется в качестве индекса, по которому в таблице отыскиваются данные, соответствующие этому ключу.

Преимущество хеширования — в том, что оно позволяет сохранять постоянным время выполнения таких операций, как поиск, считывание и запись данных, даже для больших объемов информации.

Hashtable-коллекция не гарантирует сохранения порядка элементов.

Класс Hashtable реализует интерфейсы:

IDictionary,

ICollection,

lEnumerable,

ISerializable,

238

IDeserializationCallback,

ICloneable.

Вклассе Hashtable определено множество конструкторов, но чаще всего используется следующий:

public Hashtable();

Наиболее употребимые методы класса Hashtable

Метод

Описание

 

 

public virtual bool

Возвращает значение true, если в

ContainsKey(object k)

вызывающей Hashtable-коллекции со-

 

держится ключ, заданный параметром

 

k. В противном случае возвращает зна-

 

чение false.

 

 

 

 

 

public virtual bool

Возвращает значение true, если в

ContainsValue(object v)

вызывающей Hashtable-коллекции со-

 

держится значение, заданное парамет-

 

ром v. В противном случае возвращает

 

значение false

 

 

public virtual

Возвращает

для

вызывающей

IDictionaryEnumerator

Hashtable-коллекции нумератор типа

 

IDictionaryEnumerator

 

GetEnumerator()

 

 

 

 

 

Возвращает

синхронизированную

public static Hashtable

версию

вызывающей

Hashtabie-

Synchronized(

коллекции, переданной в параметре ht.

Hashtable

 

 

 

 

ht)

 

 

 

 

В классе Hashtable, помимо свойств, определенных в реализованных им интерфейсах, также определены два собственных public-свойства. Используя следующие свойства, можно из Hashtable-коллекции получить коллекцию ключей или значений:

public virtual ICollection Keys { get ; } public virtual ICollection Values { get ; }

Вклассе определен так же и индексатор this[ключ] {get; set;}

Вклассе Hashtable пары ключ/значение хранятся в форме структуры типа DictionaryEntry, но по большей части вас это не будет касаться, поскольку свойства и методы обрабатывают ключи и значения отдельно.

// Демонстрация использования Hashtable-коллекции. using System;

using System.Collections;

class HashtableDemo

239

{

public static void Main()

{

Hashtable ht = new Hashtable(); // Создаем хеш-таблицу. // Добавляем элементы в хеш-таблицу.

ht.Add("здание",

"жилое помещение");

ht.Add("книга",

"набор печатных слов");

ht.Add("яблоко",

"съедобный фрукт");

ht.Add("автомобиль",

"транспортное средство");

//Добавляем элементы с помощью индексатора. ht ["трактор"] = "сельскохозяйственная машина";

// Извлекаем элемент по ключу. string value = (string)ht ["автомобиль"];

Console.WriteLine ("---автомобиль: " + value);

//Получаем коллекцию ключей.

//Используем ключи для получения значений. Console.WriteLine("\n---Первый способ---"); ICollection с = ht.Keys;

foreach(string str in с) Console.WriteLine(str + ": " + ht[str]);

ht.Remove("трактор"); // Удалить элемент

Console.WriteLine("\n---Второй способ---");

// Используем структуру DictionaryEntry для получения ключей и значений. foreach (DictionaryEntry de in ht)

{

Console.WriteLine(de.Key + ": " + de.Value);

}

}

}

Результаты выполнения этой программы таковы (порядок - другой):

---автомобиль: транспортное средство

---Первый способ---

здание: жилое помещение автомобиль: транспортное средство яблоко: съедобный фрукт книга: набор печатных слов

трактор: сельскохозяйственная машина

---Второй способ---

здание: жилое помещение автомобиль: транспортное средство яблоко: съедобный фрукт книга: набор печатных слов

240

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]