Use Iterators in VB Now: VB: Extend the Streamreader class: Listing 1
Most of what you see in the class is boilerplate code, with the two methods of interest being GetEnumerator and the MoveNext method. This sample also illustrates how to add an extension method to make getting the enumerator a lot simpler. The extension method will show up on an instance of the StreamReader class as a Lines function.
Module StreamExtensions
<Extension()> _
Function Lines(ByVal rdr As TextReader) _
As IEnumerable(Of String)
Return New StreamReaderLineEnumerator(rdr)
End Function
End Module
Public Class StreamReaderLineEnumerator
Implements IEnumerable(Of String)
Implements IEnumerator(Of String)
Private _rdr As TextReader
Private _current As String
Sub New(ByVal rdr As TextReader)
_rdr = rdr
End Sub
''' <summary>
''' Get's an enumerator to read lines from a stream
''' </summary>
''' <returns>IEnumerator(Of String)</returns>
''' <remarks>Can only be called once due to the
''' underlying stream.
''' Not thread safe.</remarks>
''' <exception cref="InvalidOperationException">
''' thrown if GetEnumerator is called more
''' than once</exception>
Public Function GetEnumerator() _
As IEnumerator(Of String) _
Implements IEnumerable(Of String).GetEnumerator
Static iFirstTime As Int32
If iFirstTime = 0 AndAlso _
Threading.Interlocked.Increment( _
iFirstTime) = 1 Then
Return Me
Else
Throw New InvalidOperationException( _
"GetEnumerator can only be called " & _
"once on a stream")
End If
End Function
Private Function IEnumerator_GetEnumerator() _
As IEnumerator _
Implements IEnumerable.GetEnumerator
Return GetEnumerator()
End Function
Public ReadOnly Property Current() As String _
Implements IEnumerator(Of String).Current
Get
Return _current
End Get
End Property
Private ReadOnly Property IEnumerator_Current() _
As Object Implements IEnumerator.Current
Get
Return Current
End Get
End Property
Public Function MoveNext() As Boolean _
Implements IEnumerator.MoveNext
_current = _rdr.ReadLine()
Return _current IsNot Nothing
End Function
Private Sub Reset() Implements IEnumerator.Reset
Throw New NotImplementedException()
End Sub
Public Sub Dispose() Implements _
IDisposable.Dispose
'not implemented
End Sub
End Class