Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Rozhraní IEnumerable<T> je implementováno třídami, které mohou vrátit posloupnost hodnot jedné položky najednou. Výhodou vrácení dat o jednu položku najednou je, že nemusíte načítat úplnou sadu dat do paměti, aby s ní mohli pracovat. K načtení jedné položky z dat stačí dostatek paměti. Třídy, které implementují IEnumerable(T) rozhraní, lze použít se For Each smyčkami nebo dotazy LINQ.
Představte si například aplikaci, která musí číst velký textový soubor a vracet 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. Pokud chcete dotazovat obsah 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 spotřebovalo mnohem více paměti, než je potřeba. Dotaz LINQ by mohl místo toho dotazovat obsah souboru pomocí výčtové třídy, která vrací pouze hodnoty, které odpovídají kritériím hledání. Dotazy, které vracejí pouze několik odpovídajících hodnot, spotřebovávají mnohem méně paměti.
Můžete vytvořit třídu, která implementuje IEnumerable<T> rozhraní pro zveřejnění zdrojových dat jako výčtových dat. Vaše třída, která implementuje IEnumerable(T) rozhraní, bude vyžadovat další třídu, která implementuje IEnumerator<T> rozhraní pro iteraci prostřednictvím zdrojových dat. Tyto dvě třídy umožňují vracet položky dat postupně jako konkrétní typ.
V tomto názorném postupu vytvoříte třídu, která implementuje IEnumerable(Of String) rozhraní a třídu, která implementuje IEnumerator(Of String) rozhraní pro čtení textového souboru po jednom řádku.
Poznámka:
Počítač může v následujících pokynech zobrazit různé názvy nebo umístění některých prvků uživatelského rozhraní sady Visual Studio. Edice sady Visual Studio, kterou máte, a nastavení, která používáte, určují tyto prvky. Další informace najdete v tématu Přizpůsobeníintegrovaného vývojového prostředí (IDE).
Vytvoření výčtové třídy
Vytvořte projekt výčtové třídy
V jazyce Visual Basic v nabídce Soubor přejděte na příkaz Nový a klepněte na tlačítko Projekt.
V dialogovém okně Nový projekt v podokně Typy projektů se ujistěte, že je vybraná možnost Windows . V podokně Šablony vyberte Knihovna tříd. Do pole Název zadejte
StreamReaderEnumerablea klepněte na tlačítko OK. Zobrazí se nový projekt.V Průzkumníku ř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 ENTER. Přejmenování souboru také přejmenuje třídu naStreamReaderEnumerable. Tato třída implementujeIEnumerable(Of String)rozhraní.Klikněte pravým tlačítkem myši na projekt StreamReaderEnumerable, přejděte na příkaz Přidat a klepněte na tlačítko Nová položka. Vyberte šablonu třídy . Do pole Název zadejte
StreamReaderEnumerator.vba klepněte na tlačítko OK.
První třída v tomto projektu je výčtová třída a implementuje IEnumerable(Of String) rozhraní. Toto obecné rozhraní implementuje IEnumerable rozhraní a zaručuje, že uživatelé této třídy mohou přistupovat k hodnotám zadaným jako String.
Přidání kódu pro implementaci IEnumerable
Otevřete soubor StreamReaderEnumerable.vb.
Na řádku za
Public Class StreamReaderEnumerablezadejte následující a stiskněte enter.Implements IEnumerable(Of String)Visual Basic automaticky naplní třídu členy, které jsou požadovány rozhraním
IEnumerable(Of String).Tato výčtová třída bude číst řádky z textového souboru po jednom řádku. Do třídy přidejte následující kód, který zveřejní veřejný konstruktor, který jako vstupní parametr vezme 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. Implementace metodyGetEnumeratorrozhraníIEnumerablemůže být provedenaPrivate, protože musíte odhalit pouze členy rozhraníIEnumerable(Of String). Nahraďte kód, který jazyk Visual Basic vygeneroval proGetEnumeratormetody následujícím kódem.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 IEnumeratoru
Otevřete soubor StreamReaderEnumerator.vb.
Na řádku za
Public Class StreamReaderEnumeratorzadejte následující a stiskněte enter.Implements IEnumerator(Of String)Visual Basic automaticky naplní třídu členy, které jsou požadovány rozhraním
IEnumerator(Of String).Třída enumerátoru otevře textový soubor a provede vstupně-výstupní operace souboru pro čtení řádků ze souboru. Do třídy přidejte následující kód, který zpřístupní veřejný konstruktor, který vezme cestu k souboru jako vstupní parametr a otevře textový soubor pro čtení.
Private _sr As IO.StreamReader Public Sub New(ByVal filePath As String) _sr = New IO.StreamReader(filePath) End SubVlastnosti
CurrentrozhraníIEnumerator(Of String)iIEnumeratorvrátí aktuální položku z textového souboru jakoString. Implementaci vlastnostiCurrentrozhraníIEnumeratorlze provéstPrivate, protože musíte odhalit pouze členy rozhraníIEnumerator(Of String). Nahraďte kód, který jazyk Visual Basic vygeneroval proCurrentvlastnosti, následujícím kódem.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íFalse; jinakMoveNextmetoda 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í směruje iterátor 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 SubMetoda
DisposerozhraníIEnumeratorzaručuje, že všechny nespravované prostředky jsou uvolněny před zničením iterátoru. Popisovač souboru používaný objektemStreamReaderje nespravovaný prostředek a musí být uzavřen dříve, než bude instance iterátoru zničena. Nahraďte kód, který jazyk Visual Basic vygeneroval pro metoduDisposenásledujícím kódem.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 výčtovou třídu společně s řídicími strukturami, které vyžadují objekt, který implementuje IEnumerable, například For Next smyčku 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()