Návod: Implementace IEnumerable(Of T) v jazyce Visual Basic

IEnumerable<T>Rozhraní je implementováno třídami, které mohou vracet sekvenci hodnot po jednotlivých položkách najednou. Výhodou vrácení dat jedné položky v čase je, že není nutné načíst úplnou sadu dat do paměti, abyste s ní mohli pracovat. K načtení jedné položky z dat stačí použít dostatek paměti. Třídy, které implementují IEnumerable(T) rozhraní, lze použít s For Each cykly nebo dotazy LINQ.

Představte si například aplikaci, která musí číst velký textový soubor a vrátí každý řádek ze souboru, který odpovídá konkrétním kritériím hledání. Aplikace používá dotaz LINQ k vrácení řádků ze souboru, které odpovídají zadaným kritériím. K dotazování obsahu souboru pomocí dotazu LINQ může aplikace načíst obsah souboru do pole nebo kolekce. Načtení celého souboru do pole nebo kolekce by však využívalo mnohem více paměti, než je vyžadováno. Dotaz LINQ může místo toho zadat dotaz na obsah souboru pomocí vyčíslitelné třídy a vracet pouze hodnoty, které odpovídají kritériím vyhledávání. Dotazy, které vracejí pouze pár hodnot, by využívaly mnohem méně paměti.

Můžete vytvořit třídu, která implementuje IEnumerable<T> rozhraní k vystavení zdrojových dat jako vyčíslitelného data. Vaše třída, která implementuje IEnumerable(T) rozhraní, bude vyžadovat další třídu, která implementuje IEnumerator<T> rozhraní pro iteraci skrze zdrojová data. Tyto dvě třídy umožňují vracet položky dat sekvenčně jako konkrétní typ.

V tomto návodu vytvoříte třídu, která implementuje IEnumerable(Of String) rozhraní a třídu, která implementuje IEnumerator(Of String) rozhraní pro čtení textového souboru v jednom řádku.

Poznámka

Váš počítač může v následujících pokynech zobrazovat odlišné názvy nebo umístění některých prvků uživatelského rozhraní sady Visual Studio. Tyto prvky jsou určeny edicí sady Visual Studio a použitým nastavením. Další informace najdete v tématu Přizpůsobení integrovaného vývojového prostředí (IDE).

Vytváření vyčíslitelné třídy

Vytvoření vyčíslitelného projektu třídy

  1. v Visual Basic v nabídce soubor přejděte na příkaz nový a potom klikněte na položku Project.

  2. v dialogovém okně nový Project v podokně Project typy ujistěte se, že je vybraná možnost Windows . V podokně šablony vyberte Knihovna tříd . Do pole název zadejte StreamReaderEnumerable a pak klikněte na OK. Zobrazí se nový projekt.

  3. V Průzkumník řešení klikněte pravým tlačítkem na soubor Class1. vb a klikněte na Přejmenovat. Přejmenujte soubor na StreamReaderEnumerable.vb a stiskněte klávesu ENTER. Přejmenováním souboru dojde také k přejmenování třídy na StreamReaderEnumerable . Tato třída implementuje IEnumerable(Of String) rozhraní.

  4. Klikněte pravým tlačítkem na projekt StreamReaderEnumerable, přejděte na Přidat a klikněte na Nová položka. Vyberte šablonu třídy . Do pole název zadejte StreamReaderEnumerator.vb a klikněte na OK.

První třída v tomto projektu je vyčíslitelné třída a implementuje IEnumerable(Of String) rozhraní. Toto obecné rozhraní implementuje IEnumerable rozhraní a zaručuje, že příjemci této třídy mají přístup k hodnotám, které jsou zadány jako String .

Přidejte kód pro implementaci rozhraní IEnumerable

  1. Otevřete soubor StreamReaderEnumerable. vb.

  2. Na řádku Public Class StreamReaderEnumerable Zadejte následující příkaz a stiskněte klávesu ENTER.

    Implements IEnumerable(Of String)
    

    Visual Basic automaticky naplní třídu členy, které jsou vyžadovány IEnumerable(Of String) rozhraním.

  3. Tato Výčtová třída načte řádky z textového souboru po jednom řádku. Přidejte následující kód do třídy k vystavení veřejného konstruktoru, který jako vstupní parametr převezme cestu k souboru.

    Private _filePath As String
    
    Public Sub New(ByVal filePath As String)
        _filePath = filePath
    End Sub
    
  4. Vaše implementace GetEnumerator metody IEnumerable(Of String) rozhraní vrátí novou instanci StreamReaderEnumerator třídy. Implementaci GetEnumerator metody IEnumerable rozhraní lze vytvořit Private , protože je nutné vystavit pouze členy IEnumerable(Of String) rozhraní. nahraďte kód, který Visual Basic vygeneroval pro GetEnumerator metody, pomocí následujícího kódu.

    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
    

Přidání kódu pro implementaci rozhraní IEnumerator

  1. Otevřete soubor StreamReaderEnumerator. vb.

  2. Na řádku Public Class StreamReaderEnumerator Zadejte následující příkaz a stiskněte klávesu ENTER.

    Implements IEnumerator(Of String)
    

    Visual Basic automaticky naplní třídu členy, které jsou vyžadovány IEnumerator(Of String) rozhraním.

  3. Třída enumerator otevře textový soubor a provede vstupně-výstupní operace souboru pro čtení řádků ze souboru. Přidejte následující kód do třídy k vystavení veřejného konstruktoru, který jako vstupní parametr převezme cestu k souboru, a otevřete textový soubor pro čtení.

    Private _sr As IO.StreamReader
    
    Public Sub New(ByVal filePath As String)
        _sr = New IO.StreamReader(filePath)
    End Sub
    
  4. CurrentVlastnosti IEnumerator(Of String) IEnumerator rozhraní a vracejí aktuální položku z textového souboru jako String . Implementaci Current vlastnosti IEnumerator rozhraní lze vytvořit Private , protože je nutné vystavit pouze členy IEnumerator(Of String) rozhraní. nahraďte kód, který Visual Basic vygeneroval pro Current vlastnosti, pomocí následujícího kódu.

    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. MoveNextMetoda IEnumerator rozhraní přejde na další položku v textovém souboru a aktualizuje hodnotu vrácenou Current vlastností. Pokud nejsou k dispozici žádné další položky ke čtení, MoveNext Metoda vrátí hodnotu False ; v opačném případě se MoveNext Metoda vrátí True . Do metody MoveNext přidejte následující kód.

    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. ResetMetoda IEnumerator rozhraní přesměruje iterátor, aby odkazoval na začátek textového souboru a vymaže hodnotu aktuální položky. Do metody Reset přidejte následující kód.

    Public Sub Reset() _
        Implements System.Collections.IEnumerator.Reset
    
        _sr.DiscardBufferedData()
        _sr.BaseStream.Seek(0, IO.SeekOrigin.Begin)
        _current = Nothing
    End Sub
    
  7. DisposeMetoda IEnumerator rozhraní zaručuje, že všechny nespravované prostředky jsou uvolněny před zničením iterátoru. Popisovač souboru, který je používán StreamReader objektem, je nespravovaný prostředek a je třeba jej zavřít před zničením instance iterátoru. nahraďte kód, který Visual Basic vygeneroval pro Dispose metodu, pomocí následujícího kódu.

    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
    

Použití ukázkového iterátoru

V kódu můžete použít vyčíslitelné třídy společně s řídicími strukturami, které vyžadují objekt, který implementuje IEnumerable , jako je například For Next smyčka nebo dotaz LINQ. Následující příklad ukazuje StreamReaderEnumerable v dotazu LINQ.

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

Dim results = adminRequests.ToList()

Viz také