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
v Visual Basic v nabídce soubor přejděte na příkaz nový a potom klikněte na položku Project.
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
StreamReaderEnumerablea pak klikněte na OK. Zobrazí se nový projekt.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.vba stiskněte klávesu ENTER. Přejmenováním souboru dojde také k přejmenování třídy naStreamReaderEnumerable. Tato třída implementujeIEnumerable(Of String)rozhraní.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.vba 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
Otevřete soubor StreamReaderEnumerable. vb.
Na řádku
Public Class StreamReaderEnumerableZadejte 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.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 SubVaše implementace GetEnumerator metody
IEnumerable(Of String)rozhraní vrátí novou instanciStreamReaderEnumeratortřídy. ImplementaciGetEnumeratormetodyIEnumerablerozhraní lze vytvořitPrivate, protože je nutné vystavit pouze členyIEnumerable(Of String)rozhraní. nahraďte kód, který Visual Basic vygeneroval proGetEnumeratormetody, 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
Otevřete soubor StreamReaderEnumerator. vb.
Na řádku
Public Class StreamReaderEnumeratorZadejte 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.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 SubCurrentVlastnostiIEnumerator(Of String)IEnumeratorrozhraní a vracejí aktuální položku z textového souboru jakoString. ImplementaciCurrentvlastnostiIEnumeratorrozhraní lze vytvořitPrivate, protože je nutné vystavit pouze členyIEnumerator(Of String)rozhraní. nahraďte kód, který Visual Basic vygeneroval proCurrentvlastnosti, 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 PropertyMoveNextMetodaIEnumeratorrozhraní přejde na další položku v textovém souboru a aktualizuje hodnotu vrácenouCurrentvlastností. Pokud nejsou k dispozici žádné další položky ke čtení,MoveNextMetoda vrátí hodnotuFalse; v opačném případě seMoveNextMetoda vrátíTrue. Do metodyMoveNextpř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 FunctionResetMetodaIEnumeratorrozhraní přesměruje iterátor, aby odkazoval na začátek textového souboru a vymaže hodnotu aktuální položky. Do metodyResetpř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 SubDisposeMetodaIEnumeratorrozhraní zaručuje, že všechny nespravované prostředky jsou uvolněny před zničením iterátoru. Popisovač souboru, který je používánStreamReaderobjektem, 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 proDisposemetodu, 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()