Интерфейс ICollection
Интерфейс 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 определяет и собственные методы (они сведены в табл.).
Некоторые из этих методов служат для модификации коллекции. Если же коллекция предназначена только для чтения или имеет фиксированный размер, вызов этих методов приведет к генерированию исключения типа 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; } |
|
нельзя вставлять элементы и удалять их из |
|
|
нее. |
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; } |
|
|
|
|
|
|
|
|
|
С помощью свойств 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().
|
|
|
КОЛЛЕКЦИИ |
|
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'; |
|
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 |
// Демонстрация класса 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,
•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
{
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);
}
}
}
Результаты выполнения этой программы таковы (порядок - другой):
---автомобиль: транспортное средство
---Первый способ---
здание: жилое помещение автомобиль: транспортное средство яблоко: съедобный фрукт книга: набор печатных слов
трактор: сельскохозяйственная машина
---Второй способ---
здание: жилое помещение автомобиль: транспортное средство яблоко: съедобный фрукт книга: набор печатных слов