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

Die IEnumerable<T> Schnittstelle wird implementiert von Klassen, die eine Sequenz von Werten eines Elements zu einem Zeitpunkt zurückgeben können.The IEnumerable<T> interface is implemented by classes that can return a sequence of values one item at a time. Der Vorteil der Rückgabe von Daten an ein Element zu einem Zeitpunkt liegt darin, dass Sie nicht verfügen, laden Sie den vollständigen Satz von Daten in den Arbeitsspeicher, um damit zu arbeiten.The advantage of returning data one item at a time is that you do not have to load the complete set of data into memory to work with it. Sie müssen nur ausreichend Arbeitsspeicher verwenden, um ein einzelnes Element aus den Daten zu laden.You only have to use sufficient memory to load a single item from the data. Klassen, in denen die IEnumerable(T) Schnittstelle verwendet werden kann, mit For Each Schleifen oder LINQ-Abfragen.Classes that implement the IEnumerable(T) interface can be used with For Each loops or LINQ queries.

Betrachten Sie beispielsweise eine Anwendung, die eine große Textdatei lesen muss, und jede Zeile aus der Datei, die bestimmten Suchkriterien entspricht zurückzugeben.For example, consider an application that must read a large text file and return each line from the file that matches particular search criteria. Die Anwendung verwendet eine LINQ-Abfrage zurückzugebenden Zeilen aus der Datei, die die angegebenen Kriterien entsprechen.The application uses a LINQ query to return lines from the file that match the specified criteria. Um den Inhalt der Datei mit einer LINQ-Abfrage Abfragen, konnte die Anwendung den Inhalt der Datei in ein Array oder eine Auflistung laden.To query the contents of the file by using a LINQ query, the application could load the contents of the file into an array or a collection. Laden die gesamte Datei in ein Array- oder Auflistungselement belegen jedoch würde wesentlich mehr Arbeitsspeicher als erforderlich ist.However, loading the whole file into an array or collection would consume far more memory than is required. Die LINQ-Abfrage konnte stattdessen den Inhalt der Datei mit Abfragen eine enumerable-Klasse, nur Werte zurückgeben, die den Suchkriterien entsprechen.The LINQ query could instead query the file contents by using an enumerable class, returning only values that match the search criteria. Abfragen, die nur einige übereinstimmende Werte würde viel weniger Arbeitsspeicher beansprucht.Queries that return only a few matching values would consume far less memory.

Sie können eine Klasse, die implementiert erstellen die IEnumerable<T> Schnittstelle, um die Quelldaten als aufzählbare Daten verfügbar zu machen.You can create a class that implements the IEnumerable<T> interface to expose source data as enumerable data. Die Klasse, die implementiert die IEnumerable(T) Schnittstelle erfordern eine andere Klasse, die implementiert die IEnumerator<T> Schnittstelle zum Durchlaufen der Quelldaten.Your class that implements the IEnumerable(T) interface will require another class that implements the IEnumerator<T> interface to iterate through the source data. Diese beiden Klassen können Sie Datenelemente sequenziell als bestimmten Typ zurückgeben.These two classes enable you to return items of data sequentially as a specific type.

In dieser exemplarischen Vorgehensweise erstellen Sie eine Klasse, implementiert die IEnumerable(Of String) Schnittstelle und eine Klasse, implementiert die IEnumerator(Of String) Schnittstelle, um eine Text zu einem Zeitpunkt zu lesen.In this walkthrough, you will create a class that implements the IEnumerable(Of String) interface and a class that implements the IEnumerator(Of String) interface to read a text file one line at a time.

Hinweis

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.Your computer might show different names or locations for some of the Visual Studio user interface elements in the following instructions. Diese Elemente sind von der jeweiligen Visual Studio-Version und den verwendeten Einstellungen abhängig.The Visual Studio edition that you have and the settings that you use determine these elements. Weitere Informationen finden Sie unter Personalisieren der IDE.For more information, see Personalizing the IDE.

Erstellen der Enumerable-KlasseCreating the Enumerable Class

Zum Erstellen des Projekts enumerable-KlasseTo create the enumerable class project
1. Zeigen Sie in Visual BasicVisual Basic im Menü Datei auf Neu, und klicken Sie dann auf Projekt.1. In Visual BasicVisual Basic, on the File menu, point to New and then click Project.
2. Überprüfen Sie, ob im Dialogfeld Neues Projekt im Bereich Projekttypen der Eintrag Windows ausgewählt ist.2. In the New Project dialog box, in the Project Types pane, make sure that Windows is selected. Wählen Sie im Bereich Vorlagen die Option Klassenbibliothek aus.Select Class Library in the Templates pane. Geben Sie im Feld Name die Bezeichnung StreamReaderEnumerable ein, und klicken Sie dann auf OK.In the Name box, type StreamReaderEnumerable, and then click OK. Das neue Projekt wird angezeigt.The new project is displayed.
3. In Projektmappen-Explorermit der rechten Maustaste auf die Datei Class1.vb, und klicken Sie auf umbenennen.3. In Solution Explorer, right-click the Class1.vb file and click Rename. Benennen Sie die Datei in StreamReaderEnumerable.vb um, und drücken Sie die EINGABETASTE.Rename the file to StreamReaderEnumerable.vb and press ENTER. Durch Umbenennen der Datei wird die Klasse ebenfalls in StreamReaderEnumerable umbenannt.Renaming the file will also rename the class to StreamReaderEnumerable. Diese Klasse implementiert die IEnumerable(Of String)-Schnittstelle.This class will implement the IEnumerable(Of String) interface.
4. Mit der rechten Maustaste des Projekts StreamReaderEnumerable, zeigen Sie auf hinzufügen, und klicken Sie dann auf neues Element.4. Right-click the StreamReaderEnumerable project, point to Add, and then click New Item. Wählen Sie die Klasse Vorlage.Select the Class template. In der Namen geben StreamReaderEnumerator.vb , und klicken Sie auf OK.In the Name box, type StreamReaderEnumerator.vb and click OK.

Die erste Klasse in diesem Projekt wird die enumerable-Klasse und Implementieren der IEnumerable(Of String) Schnittstelle.The first class in this project is the enumerable class and will implement the IEnumerable(Of String) interface. Diese generische Schnittstelle implementiert, die IEnumerable -Schnittstelle. zudem ist gewährleistet, dass Consumer dieser Klasse als eingegebene Werte zugreifen können String.This generic interface implements the IEnumerable interface and guarantees that consumers of this class can access values typed as String.

So fügen Sie den Code, um die "IEnumerable" implementieren hinzuTo add the code to implement IEnumerable
1. Öffnen Sie die Datei StreamReaderEnumerable.vb.1. Open the StreamReaderEnumerable.vb file.
2. In der Zeile nach Public Class StreamReaderEnumerable, geben Sie Folgendes ein, und drücken Sie die EINGABETASTE.2. On the line after Public Class StreamReaderEnumerable, type the following and press ENTER.
Implements IEnumerable(Of String)

Visual BasicVisual Basicfüllt automatisch die Klasse mit den Elementen, die erforderlich sind die IEnumerable(Of String) Schnittstelle. automatically populates the class with the members that are required by the IEnumerable(Of String) interface.
3. Diese Klasse aufzählbare gelesenen Zeilen aus einer Textdatei zeilenweise zu einem Zeitpunkt.3. This enumerable class will read lines from a text file one line at a time. Fügen Sie den folgenden Code, um die Klasse einen öffentlichen Konstruktor verfügbar machen, der einen Dateipfad als Eingabeparameter akzeptiert.Add the following code to the class to expose a public constructor that takes a file path as an input parameter.
Private _filePath As String

Public Sub New(ByVal filePath As String)
    _filePath = filePath
End Sub

4. Ihre Implementierung von der GetEnumerator Methode der IEnumerable(Of String) Schnittstelle wird eine neue Instanz der Zurückgeben der StreamReaderEnumerator Klasse.4. Your implementation of the GetEnumerator method of the IEnumerable(Of String) interface will return a new instance of the StreamReaderEnumerator class. Die Implementierung von der GetEnumerator Methode der IEnumerable Schnittstelle erfolgen Private, da Sie nur Member verfügbar machen müssen die IEnumerable(Of String) Schnittstelle.The implementation of the GetEnumerator method of the IEnumerable interface can be made Private, because you have to expose only members of the IEnumerable(Of String) interface. Ersetzen Sie den Code, Visual BasicVisual Basic für generiert die GetEnumerator Methoden mit den folgenden Code.Replace the code that Visual BasicVisual Basic generated for the GetEnumerator methods with the following 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 hinzuTo add the code to implement IEnumerator
1. Öffnen Sie die Datei StreamReaderEnumerator.vb.1. Open the StreamReaderEnumerator.vb file.
2. In der Zeile nach Public Class StreamReaderEnumerator, geben Sie Folgendes ein, und drücken Sie die EINGABETASTE.2. On the line after Public Class StreamReaderEnumerator, type the following and press ENTER.
Implements IEnumerator(Of String)

Visual BasicVisual Basicfüllt automatisch die Klasse mit den Elementen, die erforderlich sind die IEnumerator(Of String) Schnittstelle. automatically populates the class with the members that are required by the IEnumerator(Of String) interface.
3. Die Enumeratorklasse öffnet die Textdatei und führt die Datei-e/a auf die Zeilen aus der Datei zu lesen.3. The enumerator class opens the text file and performs the file I/O to read the lines from the file. Fügen Sie den folgenden Code, auf die Klasse zur Verfügung stellen einen öffentlichen Konstruktor, der einen Dateipfad als Eingabeparameter akzeptiert und die Textdatei zum Lesen öffnen.Add the following code to the class to expose a public constructor that takes a file path as an input parameter and open the text file for reading.
Private _sr As IO.StreamReader

Public Sub New(ByVal filePath As String)
    _sr = New IO.StreamReader(filePath)
End Sub

4. Die Current für beide Eigenschaften der IEnumerator(Of String) und IEnumerator Schnittstellen zurückgeben, die das aktuelle Element aus der Textdatei als eine String.4. The Current properties for both the IEnumerator(Of String) and IEnumerator interfaces return the current item from the text file as a String. Die Implementierung von der Current Eigenschaft der IEnumerator Schnittstelle erfolgen Private, da Sie nur Member verfügbar machen müssen die IEnumerator(Of String) Schnittstelle.The implementation of the Current property of the IEnumerator interface can be made Private, because you have to expose only members of the IEnumerator(Of String) interface. Ersetzen Sie den Code, Visual BasicVisual Basic für generiert die Current Eigenschaften mit den folgenden Code.Replace the code that Visual BasicVisual Basic generated for the Current properties with the following 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 zurückgegeben wird die Current Eigenschaft.5. The MoveNext method of the IEnumerator interface navigates to the next item in the text file and updates the value that is returned by the Current property. Wenn es keine Elemente mehr sind zu lesen, die MoveNext -Methode zurückkehrt Falseandernfalls die MoveNext -Methode zurückkehrt True.If there are no more items to read, the MoveNext method returns False; otherwise the MoveNext method returns True. Fügen Sie der MoveNext -Methode folgenden Code hinzu.Add the following code to the MoveNext method.
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 auf den Anfang der Datei und löscht den aktuellen Elementwert.6. The Reset method of the IEnumerator interface directs the iterator to point to the start of the text file and clears the current item value. Fügen Sie der Reset -Methode folgenden Code hinzu.Add the following code to the Reset method.
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 garantiert, dass alle nicht verwaltete Ressourcen freigegeben werden, bevor der Iterator zerstört wird.7. The Dispose method of the IEnumerator interface guarantees that all unmanaged resources are released before the iterator is destroyed. Das Dateihandle, mit der die StreamReader -Objekt ist eine nicht verwaltete Ressource und muss geschlossen werden, bevor die Iteratorinstanz zerstört wird.The file handle that is used by the StreamReader object is an unmanaged resource and must be closed before the iterator instance is destroyed. Ersetzen Sie den Code, Visual BasicVisual Basic für generiert die Dispose -Methode durch folgenden Code.Replace the code that Visual BasicVisual Basic generated for the Dispose method with the following 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

Mithilfe des BeispieliteratorsUsing the Sample Iterator

Sie können eine enumerable-Klasse in Ihrem Code zusammen mit Steuerungsstrukturen, die ein Objekt erfordern, die implementiert IEnumerable, z. B. eine For Next Schleife oder einer LINQ-Abfrage.You can use an enumerable class in your code together with control structures that require an object that implements IEnumerable, such as a For Next loop or a LINQ query. Das folgende Beispiel zeigt die StreamReaderEnumerable in einer LINQ-Abfrage.The following example shows the StreamReaderEnumerable in a LINQ query.

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

Dim results = adminRequests.ToList()

Siehe auchSee Also

Einführung in LINQ in Visual BasicIntroduction to LINQ in Visual Basic
AblaufsteuerungControl Flow
SchleifenstrukturLoop Structures
For Each...Next-AnweisungFor Each...Next Statement