Коллекции
Понятие коллекции
Интерфейсы коллекций
Перечислители
Интерфейсы пространства имен System.Collections
Классы пространства имен System.Collections
Классы пространства имен System.Collections
Интерфейс IEnumerable
Интерфейс IEnumerator
Интерфейс IEnumerator
Пример реализации итератора
Итератор
Конструктор класса-итератора
Метод MoveNext( )
Метод Reset( )
Интерфейс ICollection
Интерфейсы IComparable и IComparer
Метод CompareTo
Метод Compare
Класс Comparer
Класс ArrayList
Интерфейс IList
Методы интерфейса IList
Свойства интерфейса IList
Члены класса ArrayList
Члены класса ArrayList
Члены класса ArrayList
Конец лекции
2.93M
Категория: ПрограммированиеПрограммирование

Коллекции в С#

1. Коллекции

Лекция 13

2. Понятие коллекции

В С# под коллекцией понимается набор
элементов с заданным правилом их перебора
Классы, объекты которых способны хранить и
обрабатывать такие наборы называются классами
коллекций
Простейшим примером коллекции является
массив. Массивы – это объекты классов,
производных от базового абстрактного класса
System.Array
Другими примерами коллекций являются списки,
деревья, стеки, очереди, словари
2

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

Все коллекции разработаны на основе набора
четко определенных интерфейсов
Пространство имен System.Collections содержит
множество интерфейсов и классов, которые
определяют и реализуют встроенные коллекции
различных видов
Однако, программист может создавать и
собственные коллекции
3

4. Перечислители

Основополагающим для всех коллекций является
реализация перечислителя (итератора), который
поддерживается интерфейсами IEnumerator и
IEnumerable
Перечислитель должен обеспечивать
стандартизованный способ поэлементного
доступа к содержимому коллекции
4

5. Интерфейсы пространства имен System.Collections

Интерфейс
ICollection
Описание
Определяет размер, перечислители и методы
синхронизации для всех нестандартных коллекций
IComparer
Предоставляет метод для сравнения двух объектов.
IDictionary
Представляет небазовую коллекцию пар "ключзначение".
IDictionaryEnumerator
Перечисляет элементы неуниверсального словаря.
IEnumerable
IEnumerator
IEqualityComparer
IList
Предоставляет перечислитель, который поддерживает
простой перебор элементов неуниверсальной
коллекции.
Поддерживает простой перебор по неуниверсальной
коллекции.
Определяет методы для поддержки операций
сравнения объектов в отношении равенства.
Представляет неуниверсальную коллекцию объектов с
индивидуальным доступом, осуществляемым при
помощи индекса
5

6. Классы пространства имен System.Collections

Класс
Описание
ArrayList
Реализует интерфейс IList с помощью массива с динамическим
увеличением размера до нужного значения.
BitArray
Управляет компактным битовым массивом значений,
представленных логическими значениями, где значение true
соответствует 1, а значение false соответствует 0.
CaseInsensitiveComparer
Проверяет равенство двух объектов без учета регистра строк.
CollectionBase
Предоставляет базовый класс abstract для строго
типизированной коллекции.
Comparer
Проверяет равенство двух объектов с учетом регистра строк.
DictionaryBase
Предоставляет базовый класс abstract для строго
типизированной коллекции ключ/значение.
Предоставляет коллекцию пар "ключ-значение", которые
упорядочены по хэш-коду ключа.
Hashtable
6

7. Классы пространства имен System.Collections

Класс
Queue
ReadOnlyCollectionBase
SortedList
Stack
Описание
Предоставляет коллекцию объектов, которая обслуживается по
принципу FIFO
Предоставляет базовый класс abstract для неуниверсальной
коллекции со строгим типом, которая доступна только для
чтения.
Предоставляет коллекцию пар "ключ-значение", упорядоченных
по ключам. Доступ к парам можно получить по ключу и по
индексу.
Представляет простую неуниверсальную коллекцию объектов,
действующую по принципу LIFO
7

8. Интерфейс IEnumerable

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

9. Интерфейс IEnumerator

Данный интерфейс предоставляет следующие
члены:
◦ свойство Current типа object, позволяющее получить
текущий элемент в коллекции;
◦ bool MoveNext( ) – переход к следующему элементу
коллекции с возвратом значения true, если такой
переход возможен и false в противном случае;
◦ void Reset( ) – возврат в начальное состояние
9

10. Интерфейс IEnumerator

Сразу после выполнения метода Reset() итератор
установлен перед первым элементом коллекции
и попытка вызова свойства Current приводит к
выдаче исключения
Поэтому необходимо предварительно вызвать
метод MoveNext, чтобы переместить итератор к
первому элементу коллекции
Если метод MoveNext проходит конец
коллекции, то он возвращает значение false, а
итератор помещается после последнего
элемента коллекции и обращение к свойству
Current снова приводит к выдаче исключения
10

11. Пример реализации итератора

В качестве примера рассмотрим класс, который
содержит в качестве одного из полей массив
строк и реализует интерфейс IEnumerable:
public class ListBoxTest : IEnumerable
{...}
Структура класса ListBoxTest
Реализация метода GetEnumerator() имеет вид:
public IEnumerator GetEnumerator( )
{
return (IEnumerator) new ListBoxEnumerator(this);
}
11

12. Итератор

В методе GetEnumerator( ) создается итератор –
объект класса ListBoxEnumerator, который
приводится к типу интерфейса IEnumerator, т.е. к
типу возвращаемого значения
Аргумент this означает, что нумератор создается
для конкретного объекта класса-контейнера
ListBoxTest
Класс ListBoxEnumerator в нашем случае
реализует интерфейс IEnumerator и имеет
следующую структуру
12

13. Конструктор класса-итератора

Класс-итератор объявляется закрытым, поэтому
использовать его можно только внутри классаконтейнера
Конструктор класса-итератора имеет вид:
public ListBoxEnumerator(ListBoxTest lbt)
{
this.lbt = lbt;
index = -1;
}
Объект-итератор получает ссылку на
содержащий его объект класса-контейнера
13

14. Метод MoveNext( )

реализован следующим
образом:
public bool MoveNext( )
{
index++;
if (index >= lbt.strings.Length)
return false;
else
return true;
}
14

15. Метод Reset( )

Реализация метода Reset( ):
public void Reset( )
{
index = -1;
}
Свойство Current:
public object Current
{
get
{ return lbt[index]; }
}
Теперь можно использовать цикл foreach
15

16. Интерфейс ICollection

Еще одним важным интерфейсом,
предоставляемым платформой .NET Framework
для работы с массивами и классами коллекций,
является интерфейс ICollection
Он обладает тремя свойствами:
◦ Count,
◦ IsSynchronized,
◦ SyncRoot,
а также одним методом СоруТо( )
Чаще других используется свойство Count,
которое возвращает количество элементов в
коллекции
16

17. Интерфейсы IComparable и IComparer

Эти интерфейсы являются стандартным способом
для сравнения объектов в .NET Framework
Разница между ними заключается в следующем:
◦ интерфейс IComparable реализуется в классе
подлежащего сравнению объекта и потому позволяет
выполнять сравнения только между этим и еще каким-то
объектом;
◦ интерфейс IComparer реализуется в отдельном классе и
потому позволяет выполнять сравнения между любыми
двумя объектами
17

18. Метод CompareTo

Интерфейс IComparable поддерживает один
единственный метод CompareTo (), которому в
качестве аргумента должен передаваться объект
Этот метод возвращает результат целого типа,
позволяя в некоторых случаях оценить степень
различия между объектами
18

19. Метод Compare

Интерфейс IComparer тоже предоставляет
единственный метод Compare (), который
принимает два объекта и возвращает
целочисленный результат, точно так же, как
метод CompareTo()
В обоих случаях параметры, предоставляемые
методам, относятся к типу System.Object,
поэтому сравниваться могут объекты любого
типа
Это требует выполнения какой-то операции по
сравнению типов и, возможно, выдачи
исключений в случае обнаружения того, что
используемые типы являются неправильными
19

20. Класс Comparer

В состав .NET Framework входит используемая по
умолчанию реализация интерфейса IComparer,
предназначенная для класса по имени Comparer,
который находится в пространстве имен
System.Collections
Этот класс способен выполнять специфические
для каждой культуры операции сравнения между
простыми типами, а также любым типом,
который поддерживает интерфейс IComparable
20

21. Класс ArrayList

Классической проблемой, связанной с типом
Array, является его фиксированный размер
Класс ArrayList является массивом, чей размер
динамически увеличивается по мере
необходимости
Объекты ArrayList обладают рядом полезных
свойств и методов, позволяющих эффективно
работать с ними
Класс ArrayList реализует интерфейс IList
21

22. Интерфейс IList

Этот интерфейс объявлен в пространстве имен
System.Collections:
public interface IList : ICollection, IEnumerable
Интерфейс IList представляет коллекцию
объектов с индивидуальным доступом,
осуществляемым при помощи индекса
22

23. Методы интерфейса IList

Add
Добавляет элемент в список
Clear
Удаляет все элементы из списка
Определяет, содержится ли указанное значение в
списке
Contains
CopyTo
Копирует элементы коллекции ICollection в массив
Array, начиная с указанного индекса массива Array.
(Унаследовано от ICollection.)
GetEnumerator
Возвращает итератор, который осуществляет перебор
элементов коллекции. (Унаследовано от IEnumerable.)
IndexOf
Определяет индекс заданного элемента в списке
Insert
Вставляет элемент в список по указанному индексу.
Remove
RemoveAt
Удаляет первое вхождение указанного объекта из
списка
Удаляет элемент списка, расположенный по указанному
индексу.
23

24. Свойства интерфейса IList

Имя
Описание
Count
Возвращает число элементов, содержащихся в
коллекции ICollection. (Унаследовано от ICollection.)
IsFixedSize
Получает значение, показывающее, имеет ли список
фиксированный размер.
IsReadOnly
Получает значение, указывающее, доступна ли
коллекция только для чтения.
Получает значение, позволяющее определить, является
IsSynchronize
ли доступ к коллекции ICollection синхронизированным
d
(потокобезопасным). (Унаследовано от ICollection.)
Item
SyncRoot
Получает или задает объект по указанному индексу.
Получает объект, который позволяет синхронизировать
доступ к коллекции ICollection. (Унаследовано от
ICollection.)
24

25. Члены класса ArrayList

25

26. Члены класса ArrayList

26

27. Члены класса ArrayList

27

28. Конец лекции

28
English     Русский Правила