(0) exportieren Drucken
Alle erweitern
Dieser Artikel wurde manuell übersetzt. Bewegen Sie den Mauszeiger über die Sätze im Artikel, um den Originaltext anzuzeigen. Weitere Informationen
Übersetzung
Original

Exemplarische Vorgehensweise: Implementieren von IEnumerable(Of T) in Visual Basic

Die IEnumerable<T>-Schnittstelle wird von Klassen implementiert, die immer jeweils eine Sequenz von Werten zurückgeben können. Der Vorteil des einzelnen Zurückgebens von Daten liegt darin, dass Sie nicht den vollständigen Satz von Daten in den Arbeitsspeicher laden müssen, um damit zu arbeiten. Sie müssen nur genügend Arbeitsspeicher verwenden, um ein einzelnes Element der Daten laden zu können. Klassen, die die IEnumerable(T)-Schnittstelle implementieren, können mit For Each-Schleifen oder LINQ-Abfragen verwendet werden.

Betrachten Sie z. B. eine Anwendung, die eine große Textdatei lesen und jede Zeile der Datei zurückgeben muss, die bestimmten Suchkriterien entspricht. Die Anwendung verwendet eine LINQ-Abfrage, um die Zeilen aus der Datei zurückzugeben, die mit den angegebenen Kriterien übereinstimmen. Um den Inhalt der Datei mit einer LINQ-Abfrage abzufragen, konnte die Anwendung den Inhalt der Datei in ein Array oder eine Auflistung laden. Das Laden der gesamten Datei in ein Array oder eine Auflistung würde jedoch weitaus mehr Arbeitsspeicher erfordern als nötig. Die LINQ-Abfrage konnte stattdessen den Dateiinhalt mithilfe einer aufzählbaren Klasse abfragen und nur Werte zurückgeben, die den Suchkriterien entsprechen. Abfragen, die nur einige übereinstimmende Werte zurückgeben, würden deutlich weniger Arbeitsspeicher belegen.

Sie können eine Klasse erstellen, die die IEnumerable<T>-Schnittstelle implementiert, um Quelldaten als aufzählbare Daten verfügbar zu machen. Die Klasse, die die IEnumerable(T)-Schnittstelle implementiert, erfordert eine weitere Klasse, die die IEnumerator<T>-Schnittstelle implementiert, um die Quelldaten zu durchlaufen. Diese zwei Klassen ermöglichen es Ihnen, Elemente der Daten sequenziell als bestimmten Typ zurückzugeben.

In dieser exemplarischen Vorgehensweise wird das Erstellen einer Klasse veranschaulicht, die die IEnumerable(Of String)-Schnittstelle implementiert, sowie einer Klasse, die die IEnumerator(Of String)-Schnittstelle implementiert, um eine Textdatei zeilenweise zu lesen.

HinweisHinweis

Auf Ihrem Computer werden möglicherweise andere Namen oder Speicherorte für die Benutzeroberflächenelemente von Visual Studio angezeigt als die in den folgenden Anweisungen aufgeführten. Diese Elemente sind von der jeweiligen Visual Studio-Version und den verwendeten Einstellungen abhängig. Weitere Informationen finden Sie unter Anpassen der Entwicklungseinstellungen in Visual Studio.

So erstellen Sie das aufzählbare Klassenprojekt

  1. Zeigen Sie in Visual Basic im Menü Datei auf Neu, und klicken Sie dann auf Projekt.

  2. Überprüfen Sie, ob im Dialogfeld Neues Projekt im Bereich Projekttypen der Eintrag Windows ausgewählt ist. Wählen Sie im Bereich Vorlagen den Eintrag Klassenbibliothek aus. Geben Sie im Feld Name die Bezeichnung StreamReaderEnumerable ein, und klicken Sie auf OK. Das neue Projekt wird angezeigt.

  3. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf die Datei Class1.vb, und klicken Sie auf Umbenennen. Benennen Sie die Datei in StreamReaderEnumerable.vb um, und drücken Sie die EINGABETASTE. Durch das Umbenennen der Datei wird auch die Klasse in StreamReaderEnumerable umbenannt. Diese Klasse implementiert die IEnumerable(Of String)-Schnittstelle.

  4. Klicken Sie mit der rechten Maustaste auf das Projekt StreamReaderEnumerable, zeigen Sie auf Hinzufügen, und klicken Sie dann auf Neues Element. Wählen Sie die Vorlage Klasse aus. Geben Sie im Feld Name die Bezeichnung StreamReaderEnumerator.vb ein, und klicken Sie auf OK.

Die erste Klasse in diesem Projekt ist die aufzählbare Klasse, die die IEnumerable(Of String)-Schnittstelle implementiert. Diese generische Schnittstelle implementiert die IEnumerable-Schnittstelle und gewährleistet, dass Consumer dieser Klasse auf Werte vom Typ String zugreifen können.

So fügen Sie den Code zum Implementieren von IEnumerable hinzu

  1. Öffnen Sie die Datei StreamReaderEnumerable.vb.

  2. Geben Sie in der Zeile nach Public Class StreamReaderEnumerable Folgendes ein, und drücken Sie die EINGABETASTE.

    
    Implements IEnumerable(Of String)
    
    
    

    Visual Basic füllt die Klasse automatisch mit den Membern auf, die für die IEnumerable(Of String)-Schnittstelle erforderlich sind.

  3. Diese aufzählbare Klasse liest die Zeilen aus einer Textdatei einzeln. Fügen Sie der Klasse den folgenden Code hinzu, um einen öffentlichen Konstruktor verfügbar zu machen, der einen Dateipfad als Eingabeparameter akzeptiert.

    
    Private _filePath As String
    
    Public Sub New(ByVal filePath As String)
        _filePath = filePath
    End Sub
    
    
    
  4. Die Implementierung der GetEnumerator-Methode der IEnumerable(Of String)-Schnittstelle gibt eine neue Instanz der StreamReaderEnumerator-Klasse zurück. Die Implementierung der GetEnumerator-Methode der IEnumerable-Schnittstelle kann als Private festgelegt werden, da Sie nur Member der IEnumerable(Of String)-Schnittstelle verfügbar machen müssen. Ersetzen Sie den Code, den Visual Basic für die GetEnumerator-Methoden generiert hat, durch den folgenden Code.

    
    Public Function GetEnumerator() As IEnumerator(Of String) _
        Implements IEnumerable(Of String).GetEnumerator
    
        Return New StreamReaderEnumerator(_filePath)
    End Function
    
    Private Function GetEnumerator1() As IEnumerator _
        Implements IEnumerable.GetEnumerator
    
        Return Me.GetEnumerator()
    End Function
    
    
    

So fügen Sie den Code zum Implementieren von IEnumerator hinzu

  1. Öffnen Sie die Datei StreamReaderEnumerator.vb.

  2. Geben Sie in der Zeile nach Public Class StreamReaderEnumerator Folgendes ein, und drücken Sie die EINGABETASTE.

    
    Implements IEnumerator(Of String)
    
    
    

    Visual Basic füllt die Klasse automatisch mit den Membern auf, die für die IEnumerator(Of String)-Schnittstelle erforderlich sind.

  3. Die Enumeratorklasse öffnet die Textdatei und führt die Datei-E/A aus, um die Zeilen aus der Datei zu lesen. Fügen Sie der Klasse den folgenden Code hinzu, um einen öffentlichen Konstruktor verfügbar zu machen, der einen Dateipfad als Eingabeparameter akzeptiert, und öffnen Sie die Textdatei zum Lesen.

    
    Private _sr As IO.StreamReader
    
    Public Sub New(ByVal filePath As String)
        _sr = New IO.StreamReader(filePath)
    End Sub
    
    
    
  4. Die Current-Eigenschaften für die IEnumerator(Of String)-Schnittstelle und die IEnumerator-Schnittstelle geben das aktuelle Element der Textdatei als String zurück. Die Implementierung der Current-Eigenschaft der IEnumerator-Schnittstelle kann als Private festgelegt werden, da Sie nur Member der IEnumerator(Of String)-Schnittstelle verfügbar machen müssen. Ersetzen Sie den Code, den Visual Basic für die Current-Eigenschaften generiert hat, durch den folgenden Code.

    
    Private _current As String
    
    Public ReadOnly Property Current() As String _
        Implements IEnumerator(Of String).Current
    
        Get
            If _sr Is Nothing OrElse _current Is Nothing Then
                Throw New InvalidOperationException()
            End If
    
            Return _current
        End Get
    End Property
    
    Private ReadOnly Property Current1() As Object _
        Implements IEnumerator.Current
    
        Get
            Return Me.Current
        End Get
    End Property
    
    
    
  5. Die MoveNext-Methode der IEnumerator-Schnittstelle navigiert zum nächsten Element in der Textdatei und aktualisiert den Wert, der von der Current-Eigenschaft zurückgegeben wird. Wenn keine zu lesenden Elemente mehr vorhanden sind, gibt die MoveNext-Methode False zurück. Andernfalls gibt die MoveNext-Methode True zurück. Fügen Sie der MoveNext-Methode folgenden Code hinzu.

    
    Public Function MoveNext() As Boolean _
        Implements System.Collections.IEnumerator.MoveNext
    
        _current = _sr.ReadLine()
        If _current Is Nothing Then Return False
        Return True
    End Function
    
    
    
  6. Die Reset-Methode der IEnumerator-Schnittstelle weist den Iterator an, auf den Start der Textdatei zu zeigen, und löscht den aktuellen Elementwert. Fügen Sie der Reset-Methode folgenden Code hinzu.

    
    Public Sub Reset() _
        Implements System.Collections.IEnumerator.Reset
    
        _sr.DiscardBufferedData()
        _sr.BaseStream.Seek(0, IO.SeekOrigin.Begin)
        _current = Nothing
    End Sub
    
    
    
  7. Die Dispose-Methode der IEnumerator-Schnittstelle gewährleistet, dass alle nicht verwalteten Ressourcen freigegeben werden, bevor der Iterator zerstört wird. Das vom StreamReader-Objekt verwendete Dateihandle ist eine nicht verwaltete Ressource und muss geschlossen werden, bevor die Iteratorinstanz zerstört wird. Ersetzen Sie den Code, den Visual Basic für die Dispose-Methode generiert hat, durch den folgenden Code.

    
    Private disposedValue As Boolean = False
    
    Protected Overridable Sub Dispose(ByVal disposing As Boolean)
        If Not Me.disposedValue Then
            If disposing Then
                ' Dispose of managed resources.
            End If
            _current = Nothing
            _sr.Close()
            _sr.Dispose()
        End If
    
        Me.disposedValue = True
    End Sub
    
    Public Sub Dispose() Implements IDisposable.Dispose
        Dispose(True)
        GC.SuppressFinalize(Me)
    End Sub
    
    Protected Overrides Sub Finalize()
        Dispose(False)
    End Sub
    
    
    

Sie können eine aufzählbare Klasse im Code zusammen mit Steuerstrukturen verwenden, die ein Objekt erfordern, das IEnumerable implementiert, z. B. eine For Next-Schleife oder eine LINQ-Abfrage. Im folgenden Beispiel wird StreamReaderEnumerable in einer LINQ-Abfrage gezeigt.


Dim adminRequests = 
    From line In New StreamReaderEnumerable("..\..\log.txt")
    Where line.Contains("admin.aspx 401")

Dim results = adminRequests.ToList()


Community-Beiträge

HINZUFÜGEN
Anzeigen:
© 2014 Microsoft