Интерфейсы IEnumerable и IEnumerator

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

Основой для большинства встроенных коллекций является реализация интерфейсов IEnumerable и IEnumerator, которые определяют базовый функционал коллекций. Благодаря реализации этих интерфейсов мы можем перебирать объекты коллекции в цикле foreach.

Интерфейс IEnumerable имеет метод, возвращающий ссылку на другой интерфейс - перечислитель:

Public Interface IEnumerable
	GetEnumerator() As IEnumerator
End Interface

А интерфейс IEnumerator определяет функционал для перебора внутренних объектов в контейнере:

Public Interface IEnumerator
    Function MoveNext() As Boolean 'перемещение на одну позицию вперед в контейнере элементов
    ReadOnly Property Current() As Object 'текущий элемент в контейнере
    Sub Reset() 'перемещение в начало контейнера
End Interface

Возьмем пример с классом Library из прошлой темы и реализуем в этом классе интерфейс IEnumerable:

Module Module1

    Sub Main()

        Dim library As New Library()

        For Each b As Book In library
            Console.WriteLine(b.Name)
        Next



        Console.ReadLine()
    End Sub

    Class Book
        Public Property Name() As String
        Sub New(name As String)
            Me.Name = name
        End Sub
    End Class
   
    Class Library
        Implements IEnumerable
        Dim books As Book()

        Sub New()
            books = New Book() {New Book("Отцы и дети"), New Book("Война и мир"),
                New Book("Евгений Онегин")}
        End Sub

        Public ReadOnly Property Length As Integer
            Get
                Return books.Length
            End Get

        End Property

        Default Public Property Item(index As Integer) As Book
            Get
                Return books(index)
            End Get
            Set(value As Book)
                books(index) = value
            End Set
        End Property

        'возвращаем перечислитель
        Public Function GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator
            Return books.GetEnumerator()
        End Function

    End Class

End Module

Таким образом, благодаря реализации IEnumerable мы сможем пройтись по объекту Library в цикле for each, как по контейнеру элементов.

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