Основой для большинства встроенных коллекций является реализация интерфейсов 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, как по контейнеру элементов.