Коллекции

Введение в коллекции

Последнее обновление: 30.10.2015

Для работы с наборами элементов различных видов в Visual Basic.NET имеются массивы. Однако их использование не всегда удобно. Так, при создании массива нам надо изначально задать его длину. Если же нам вдруг надо изменить его длину, то придется использовать оператор ReDim. Куда более гибким инструментом по сравнению с массивами являются коллекции. Но основное удобство коллекций не только в этом, а еще и в том, что они реализуют стандартные структуры данных, например, стек, очередь, словарь, которые могут пригодиться для решения различных специальных задач.

Классы коллекций в .NET в основном находятся в пространствах имен System.Collections (необобщенные коллекции), System.Collections.Generic (обобщенные или типизированные коллекции) и System.Collections.Specialized (специальные классы коллекций).

Несмотря на многочисленность и разнородность классов коллекций, все они имеют единую основу: все они реализуют интерфейсы IEnumerator и IEnumerable (либо их обобщенные двойники - IEnumerator(Of T) и IEnumerable(Of T)). Интерфейс IEnumerator представляет перечислитель, с помощью которого коллекция последовательно перебирается, например, в цикле foreach. А интерфейс IEnumerable через свой метод GetEnumerator предоставляет перечислитель всем классам, реализующим данный интерфейс. Поэтому интерфейс IEnumerable (IEnumerable(Of T)) является базовым для всех коллекций.

Рассмотрим создание и применение двух коллекций:

Module Module1

    Sub Main()

        'необобщенная коллекция ArrayList
        Dim objectList As New ArrayList() From {1, 2, "string", 7.0}

        Dim obj As Object = 45.8

        objectList.Add(obj)
        objectList.Add("string2")
        objectList.RemoveAt(0) ' удаление первого элемента
        For Each item As Object In objectList
            Console.WriteLine(item)
        Next
        Console.WriteLine("Общее число элементов коллекции: " & objectList.Count.ToString())
        'обобщенная коллекция List
        Dim states As New List(Of String)() From {"Россия", "США", "Великобритания", "Китай"}
        states.Add("Франция")
        states.RemoveAt(1) 'удаление второго элемента
        For Each item As String In states
            Console.WriteLine(item)
        Next

        Console.ReadLine()
    End Sub

End Module

В данном примере создаются две коллекции: необобщенная - ArrayList и обобщенная - List. В обоих случаях коллекции сразу же инициализируются некоторыми начальными данными. Для инициализации надо после вызова конструктора указать ключевое слово From, после которого идет в фигурных скобках набор элементов коллекции: Dim objectList As New ArrayList() From {1, 2, "string", 7.0}. Если бы нам не требовалось бы выполнять инициализацию, и надо было бы просто создать пустую коллекцию, можно было бы просто написать Dim objectList As New ArrayList()

Большая часть встроенных коллекций поддерживает добавление элементов. В данном случае добавление производится методом Add, но для других коллекций название метода может отличаться. Также большинство коллекций реализуют удаление (в данном примере производится с помощью метода RemoveAt).

Используя свойство Count, у коллекций можно узнать количество элементов.

Обе коллекции перебираются в цикле For Each. Однако важно учитывать, что подобный перебор стал возможным благодаря реализации обоими классами интерфейса IEnumerable/IEnumerable(Of T).

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

Необобщенные коллекции

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

  • IEumerator: реализация данного интерфейса позволяет перебирать в цикле For Each

  • IEnumerable: определяет метод GetEnumerator, который возвращает перечислитель - то есть некоторый объект, реализующий интерфейс IEumerator.

  • ICollection: базовый интерфейс для всех необобщенных коллекций, определяющий основные методы и свойства для всех классов, реализующих данный интерфейс (например, свойство Count). Данный интерфейс унаследован от интерфейса IEnumerable.

  • IList: позволяет получать элементы коллекции по порядку и определяет методы для манипуляции ими: Add (добавление элементов), Remove/RemoveAt (удаление элемента) и ряд других.

  • IComparer: определяет метод int Compare(object x, object y) для сравнения двух объектов

  • IDictionary: определяет поведение коллекции, при котором она должна хранить объекты в виде пар ключ-значение: для каждого объекта определяется уникальный ключ, и этому ключу соответствует определенное значение

  • IDictionaryEnumerator: определяет методы и свойства для перечислителя словаря

  • IEqualityComparer: определяет два метода Equals и GetHashCode, с помощью которых два объекта сравниваются на предмет равенства

Эти интерфейсы реализуются следующими классами коллекций в пространстве имен System.Collections:

  • ArrayList: класс простой коллекции объектов. Реализует интерфейсы IList, ICollection, IEnumerable

  • BitArray: класс коллекции, содержащей массив битовых значений. Реализует интерфейсы ICollection, IEnumerable

  • Hashtable: класс коллекции, представляющей хэш-таблицу и храняющий набор пар "ключ-значение"

  • Queue: класс очереди объектов, работающей по алгоритму FIFO("первый вошел -первый вышел"). Реализует интерфейсы ICollection, IEnumerable

  • SortedList: класс коллекции, хранящей наборы пар "ключ-значение", отсортированных по ключу. Реализует интерфейсы ICollection, IDictionary, IEnumerable

  • Stack: класс стека

Обобщенные коллекции

Ранее в теме Обобщенные типы уже рассматривались обобщенные классы, универсальный параметр и примеры их использования. Обобщенные коллекции - это те же самые обобщенные классы, которые имеют те же преимущества над необобщенными коллекциями: повышение производительности (не надо тратить время на упаковку и распаковку объекта) и типобезопасность.

Классы обобщенных коллекций располагаются в пространстве имен System.Collections.Generic. Функционал коллекций также по большей части описывается в обобщенных интерфейсах.

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

  • IEumerator(Of T): определяет методы, с помощью которых можно перебирать элементы коллекции по очереди в цикле For Each

  • IEnumerable(Of T): содержит метод GetEnumerator, с помощью которого можно получать элементы любой коллекции

  • ICollection(Of T): представляет общие методы и свойства для всех обобщенных коллекций (в частности, методы CopyTo, Add, Remove, Contains, свойство Count)

  • IList(Of T): предоставляет функционал для создания последовательных списков

  • IComparer(Of T): определяет метод Compare для сравнения двух объектов

  • IDictionary(Of TKey, TValue): определяет поведение коллекции, которая хранит объекты в виде пар ключ-значение: каждый объект имеет уникальный ключ типа, указанного в параметре TKey, и этому ключу соответствует определенное значение, имеющее тип, указанный в параметре TValue

  • IEqualityComparer(Of T): содержит методы, с помощью которых два однотипных объекта сравниваются на предмет равенства

Эти интерфейсы реализуются следующими классами коллекций из пространства имен System.Collections.Generic:

  • List(Of T): класс последовательного списка. Реализует интерфейсы IList(Of T), ICollection(Of T), IEnumerable(Of T)

  • Dictionary(Of TKey, TValue): класс коллекции-словаря, хранящего наборы пар "ключ-значение". Реализует интерфейсы ICollection(Of T), IEnumerable(Of T), IDictionary(Of TKey, TValue)

  • LinkedList(Of T): класс двухсвязанного списка. Реализует интерфейсы ICollection(Of T) и IEnumerable(Of T)

  • Queue(Of T): класс очереди объектов, работающей по алгоритму FIFO ("первый вошел -первый вышел"). Реализует интерфейсы ICollection, IEnumerable(Of T)

  • SortedSet(Of T): класс отсортированной коллекции однотипных объектов. Реализует интерфейсы ICollection(Of T), ISet(Of T), IEnumerable(Of T)

  • SortedList(Of TKey, TValue): класс коллекции, хранящей наборы пар "ключ-значение", отсортированных по ключу. Реализует интерфейсы ICollection(Of T), IEnumerable(Of T), IDictionary(Of TKey, TValue)

  • Stack(Of T): класс стека однотипных объектов. Реализует интерфейсы ICollection(Of T) и IEnumerable(Of T)

Как видно из перечисления двух типов коллекций большинство обобщенных классов коллекций дублируют необобщенные коллекции. Какой тип коллекции тогда использовать? Если предполагается, что коллекция будет содержать только однотипные объекты, тогда предпочтительнее использовать обобщенные коллекции.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850