Similar presentations:
Коллекции в С#
1. Коллекции
Лекция 132. Понятие коллекции
В С# под коллекцией понимается наборэлементов с заданным правилом их перебора
Классы, объекты которых способны хранить и
обрабатывать такие наборы называются классами
коллекций
Простейшим примером коллекции является
массив. Массивы – это объекты классов,
производных от базового абстрактного класса
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