Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Интерфейсы коллекций

Mclntosh 13

Cortland 12

Winsap 11

RedDel 10

GoldenDel 1

Jonathan 0

Цвет сорта Mclntosh - красно-зеленый

Цвет сорта Cortland - красный

Цвет сорта Winsap - красный

Цвет сорта RedDel - красный

Цвет сорта GoldenDel - желтый

Цвет сорта Jonathan - красный

Mclntosh имеет значение 5

Cortland имеет значение 4

Winsap имеет значение 3

RedDel имеет значение 2

GoldenDel имеет значение 1

Jonathan имеет значение О

 

Обратите внимание на то, как for - циклы управляются переменной типа apple. Поскольку перечисление — это целочисленный тип, значение перечисления может быть использовано везде, где допустимы целые значения. Поскольку значения перечислимого типа начинаются с нуля, их можно использовать для индексирования массива color (чтобы получить цвет яблок). Заметьте: в этом случае необходимо выполнить приведение типа. Как упоминалось выше, неявные преобразования между целочисленными и перечислимыми типами не определены. Поэтому без явно заданного приведения типа здесь не обойтись.

Поскольку перечислимые типы представляют собой целочисленные значения, их можно использовать для управления switch - инструкцией.


 

6.9.1 Инициализация перечислений

Одно или несколько символов в перечислении можно определить с помощью инициализатора. Это реализуется путем использования знака " равно " и последующего целого значения. Символам, стоящим после инициализатора, присваиваются значения, превышающие предыдущее значение инициализации. Например, следующий фрагмент кода присваивает число 10 символу RedDel. enum apple {Jonathan, GoldenDel, RedDel = 10, Winsap, Cortland, Mclntosh };

Вот какие значения имеют теперь эти символы:

 

6.9.2 Задание базового типа перечисления

По умолчанию перечисления используют тип int, но можно также создать перечисление любого другого целочисленного типа, за исключением типа char. Чтобы задать тип, отличный от int, укажите этот базовый тип после имени перечисления и двоеточия. Например, следующая инструкция создает перечисление apple с базовым типом byte.

enum apple: byte {Jonathan, GoldenDel, RedDel, Winsap, Cortland, Mclntosh};

Теперь член apple.Winsap, например, представляет собой byte - значение.

 

 


 

Структуры данных, коллекции и классы-прототипы

В C# под коллекцией понимается группа объектов. Пространство имен System.Collections содержит множество интерфейсов и классов, которые определяют и реализуют коллекции различных типов (динамические массивы, стеки, очереди, словари, хеш-таблицы и т.п.).

Интерфейсы, которые поддерживают коллекции и их иерархия приведены на рисунке 3.1.

 

Рис. 3.1. Иерархия интерфейсов System.Collections

 

Интерфейс ICollection можно назвать фундаментом, на котором построены все коллекции. В нем объявлены основные методы и свойства, без которых не может обойтись ни одна коллекция. Самое востребованное свойство этого интерфейса – Count, содержит количество элементов, хранимых в коллекции в данный момент. Если свойство Count равно нулю, значит, коллекция пуста. В интерфейсе ICollection определен следующий метод:

void CopyTo(Array target, int startIdx)

Этот метод копирует содержимое коллекции в массив, заданный параметром target, начиная с индекса, заданного параметром startIdx. Можно сказать, что метод CopyTo() обеспечивает переход от коллекции к стандартному C#-массиву.

 

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

 

Метод Описание
int Add(object obj) Добавляет объект obj в вызывающую коллекцию. Возвращает индекс, по которому этот объект сохранен
void Clear() Удаляет все элементы из вызывающей коллекции
bool Contains(object obj) Возвращает true, если вызывающая коллекция содержит объект obj, иначе false
int IndexOf(object obj) Возвращает индекс объекта obj, если он (объект) содержится в вызывающей коллекции, иначе возвращает –1
void Insert(int idx, object obj) Вставляет в вызывающую коллекцию объект obj по индексу idx. Последующие элементы смещаются вперед, чтобы освободить место для вставляемого объекта
void Remove(object obj) Удаляет из вызывающей коллекции первое вхождение объекта obj. Последующие элементы смещаются назад
void RemoveAt(int idx) Удаляет из вызывающей коллекции объект, расположенный по индексу idx. Последующие элементы смещаются назад

 

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

boolIsFixedSize { get; } – равно true, если коллекция имеет фиксированный размер, т.е. в нее нельзя вставлять элементы и удалять их из нее.

boolIsReadOnly { get; } – равно true, если коллекция предназначена только для чтения, т.е. содержимое коллекции не подлежит изменению.

В интерфейсе IList определен следующий индексатор:

object this[int idx] { get; set; }

Этот индексатор можно использовать для считывания или записи значения нужного элемента (но не для добавления).

 

Интерфейс IDictionary определяет поведение коллекции, которая служит для хранения пар ключ/значение. Сохраненную однажды пару можно извлечь по заданному ключу. Интерфейс IDictionary наследует интерфейс ICollection. Методы, объявленные в интерфейсе IDictionary, сведены в таблице:

 

Метод Описание
void Add(object k, object v) Добавляет в вызывающую коллекцию пару ключ/значение, заданную параметрами k и v. Ключ k не должен быть нулевым. Если ключ k уже хранится в коллекции, генерируется исключение типа ArgumentException
void Clear() Удаляет все пары ключ/значение из вызывающей коллекции
bool Contains(object k) Возвращает true, если вызывающая коллекция содержит объект k в качестве ключа, иначе false
IDictionaryEnumerator GetEnumerator() Возвращает нумератор для вызывающей коллекции
void Remove(object k) Удаляет элемент с ключом k

 

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

 

Свойство Описание
bool IsFixedSize {get; } Равно true, если словарь имеет фиксированный размер
bool IsReadOnly { get; } Равно true, если словарь предназначен только для чтения
ICollection Keys { get; } Получает коллекцию ключей
ICollection Values { get; } Получает коллекцию значений

 

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

object this[object key] { get; set; }

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

 

Интерфейс IEnumerable должен быть реализован в любом классе, если в нем предполагается поддержка нумераторов. В этом интерфейсе определен единственный метод:

IEnumeratorGetEnumerator()

Он возвращает нумератор для коллекции. Кроме того, реализация интерфейса IEnumerable позволяет получить доступ к содержимому коллекции с помощью цикла foreach.

 

Интерфейс IEnumerator, собственно, и определяет действие любого нумератора. Используя его методы, можно циклически опросить элементы коллекции. Для коллекций, в которых хранятся пары ключ/значение (т.е. словари), метод GetEnumerator() возвращает объект типа IDictionaryEnumerator, а не IEnumerator. Интерфейс IDictionaryEnumerator является производным от интерфейса IEnumerator и распространяет свои функциональные возможности нумератора на область словарей.

В интерфейсе IEnumerator определено единственное свойство:

objectCurrent { get; }

Это свойство позволяет получить (но не установить) элемент, соответствующий текущему значению нумератора.

В интерфейсе IEnumerator определены два метода:

 

Метод Описание
bool MoveNext() Перемещает текущую позицию нумератора к следующему элементу коллекции. Возвращает false, если достигнут конец коллекции, иначе true. До первого обращения к этому методу значение свойства Current не определено
void Reset() Устанавливает нумератор в начало коллекции

 

Интерфейс IDictionaryEnumerator дополнительно определяет «свои» свойства:

 

Свойство Описание
DictionaryEntry Entry {get; } Получает пару ключ/значение в форме структуры типа DictionaryEntry. В этой структуре определены два свойства, Key и Value, которые можно использовать для доступа к ключу или значению, относящемуся к соответствующему элементу
object Key {get;} Получает прямой доступ к ключу
object Value {get;} Получает прямой доступ к значению

 

В интерфейсе IComparer определен метод, который позволяет сравнивать два объекта:

int Compare (object v1, object v2)

Этот метод возвращает положительное число, если значение v1 больше значения v2, отрицательное, если v1 меньше v2, и ноль, если сравниваемые значения равны. Этот интерфейс можно использовать для задания способа сортировки элементов коллекции.

 

Интерфейс IHashCodeProvider должен быть реализован коллекцией, если необходимо определить собственную версию метода GetHashCode(). Все объекты (для получения хеш-кода) наследуют метод Object.GetHashCode(), который используется по умолчанию. посредством реализации интерфейса IHashCodeProvider можно определить альтернативный метод.

 

<== предыдущая лекция | следующая лекция ==>
Интерфейсные индексаторы | Лекция 7. Обработка исключительных ситуаций
Поделиться с друзьями:


Дата добавления: 2014-01-06; Просмотров: 588; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.021 сек.