A feladat megvalósításához az osztályunkat az IEnumerable és IEnumerator interfészekből kell származtatnunk.
Public Class MyList
Implements IEnumerator
Létrehozunk benne egy változót, mely az aktuális elemet mutatja majd, valamint egy tömböt, mely az elemeinket tárolja. Az egyszerűség kedvéért most egy fix elemszámú és előre feltöltött listát készítünk.
Private iPos As Integer = -1
Private items As String() = {"Hétfő", "Kedd", "Szerda", "Csütörtök", "Péntek", "Szombat", "Vasárnap"}
Most már csak a két interfész függvényeit kell implementálnunk. A GetEnumerator függvényben kell visszaadnunk a saját osztályunk példányát IEnumerator interfész típusban.
Public Function GetEnumerator() As IEnumerator
Return CType(Me, IEnumerator)
End Function 'GetEnumerator
A MoveNext függvénynek lesz az a feladata, hogy következő elemre álljon a listánkban. Itt nyilván ellenőriznünk kell, hogy nem értünk-e még a lista végére. Ha nem, akkor növelhetjük az iPos változónk értékét. A függvény visszatérési értéke igaz kell hogy legyen, ha még nem értünk a lista végére és hamis, ha már igen.
Public Function MoveNext() As Boolean Implements IEnumerator.MoveNext
If iPos < items.Length - 1 Then
iPos += 1
Return True
Else
Return False
End If
End Function 'MoveNext
Szükséges még a Reset függvény felhasználása is, melynek az a funkciója, hogy alaphelyzetbe állítja a listát. Jelen esetben ez most csak az iPos változónkat érinti.
Public Sub Reset() Implements IEnumerator.Reset
iPos = -1
End Sub 'Reset
A Current nevű property szolgáltatja mindig az aktuális elemet object típusban. Az aktuális elem sorszámát az iPos tárolja, így egyszerűen csak vissza kell adnunk a tömbnek ezt az elemét.
Public ReadOnly Property Current() As Object Implements IEnumerator.Current
Get
Return items(iPos)
End Get
End Property
End Class 'MyList
Ezzel az osztályunk el is készült, most nézzük a felhasználási módját: először is létrehozunk belőle egy példányt, majd ezt követően egy foreach ciklussal végigmehetünk az elemein, melyet szabadon felhasználhatunk.
Private Sub button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles button1.Click
Dim ml As New MyList()
Dim s As String
For Each s In ml
listBox1.Items.Add(s)
Next s
End Sub 'button1_Click