Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A IEnumerable<T> felületet olyan osztályok implementálják, amelyek egyszerre egy elemből álló értéksorozatot képesek visszaadni. Az adatok egyenkénti visszaadásának előnye, hogy nem kell betöltenie a teljes adatkészletet a memóriába, hogy működjön velük. Csak elegendő memóriát kell használnia ahhoz, hogy egyetlen elemet töltsön be az adatokból. Az IEnumerable(T) interfészt megvalósító osztályok hurkokkal vagy For Each LINQ-lekérdezésekkel használhatók.
Vegyük például azt az alkalmazást, amely egy nagy szöveges fájlt olvas be, és a fájl minden sorát visszaadja, amely megfelel az adott keresési feltételeknek. Az alkalmazás LINQ-lekérdezéssel adja vissza a megadott feltételeknek megfelelő sorokat a fájlból. Ha LINQ-lekérdezéssel szeretné lekérdezni a fájl tartalmát, az alkalmazás betöltheti a fájl tartalmát egy tömbbe vagy gyűjteménybe. A teljes fájl tömbbe vagy gyűjteménybe való betöltése azonban a szükségesnél sokkal több memóriát használna fel. A LINQ-lekérdezés ehelyett egy számbavételi osztály használatával kérdezheti le a fájl tartalmát, és csak a keresési feltételeknek megfelelő értékeket adja vissza. A csak néhány egyező értéket visszaadó lekérdezések sokkal kevesebb memóriát használnak fel.
Létrehozhat egy osztályt, amely implementálja az interfészt a IEnumerable<T> forrásadatok számbavételes adatként való elérhetővé megvalósításához. Az interfészt megvalósító IEnumerable(T) osztálynak szüksége lesz egy másik osztályra, amely implementálja a IEnumerator<T> felületet a forrásadatokon keresztüli iteráláshoz. Ez a két osztály lehetővé teszi az adatelemek egymás utáni visszaadását egy adott típusként.
Ebben az útmutatóban létrehoz egy osztályt, amely megvalósítja az IEnumerable(Of String) interfészt, és egy osztályt, amely megvalósítja a IEnumerator(Of String) felületet, hogy egyszerre egy sornyi szövegfájlt olvasson fel.
Megjegyzés:
Előfordulhat, hogy a számítógép különböző neveket vagy helyeket jelenít meg a Visual Studio felhasználói felületének egyes elemeihez az alábbi utasításokban. Ezeket az elemeket a Visual Studio-kiadás és a használt beállítások határozzák meg. További információért lásd: A fejlesztői környezet személyre szabása.
Az Enumerable osztály létrehozása
Az enumerable class project létrehozása
A Visual Basic Fájl menüjében mutasson az Új pontra, majd kattintson a Project gombra.
Az Új projekt párbeszédpanel Projekttípusok paneljén győződjön meg arról, hogy a Windows ki van jelölve. Válassza az Osztálytár lehetőséget a Sablonok panelen. Írja be a
StreamReaderEnumerablemezőbe, majd kattintson az OK gombra. Megjelenik az új projekt.A Megoldáskezelőben kattintson a jobb gombbal a Class1.vb fájlra, és kattintson az Átnevezés parancsra. Nevezze át a fájlt,
StreamReaderEnumerable.vbés nyomja le az ENTER billentyűt. A fájl átnevezése az osztályt is átnevezi a következőreStreamReaderEnumerable: . Ez az osztály implementálja aIEnumerable(Of String)felületet.Kattintson a jobb gombbal a StreamReaderEnumerable projektre, mutasson a Hozzáadás pontra, majd kattintson az Új elem parancsra. Válassza ki az Osztálysablont . Írja be a
StreamReaderEnumerator.vbmezőbe, és kattintson az OK gombra.
A projekt első osztálya az enumerálható osztály, és implementálja a IEnumerable(Of String) felületet. Ez az általános felület implementálja az IEnumerable interfészt, és garantálja, hogy az osztály felhasználói hozzáférhetnek a következőképpen Stringbeírt értékekhez.
Adja hozzá a kódot az IEnumerable implementálásához
Nyissa meg a StreamReaderEnumerable.vb fájlt.
Írja be a következő sorba, a
Public Class StreamReaderEnumerableután, és nyomja le az ENTER billentyűt.Implements IEnumerable(Of String)A Visual Basic automatikusan kitölti az osztályt a felület által
IEnumerable(Of String)megkövetelt tagokkal.Ez a számbavételi osztály egyszerre egy sornyi szöveget olvas be egy szövegfájlból. Adja hozzá az alábbi kódot az osztályhoz egy olyan nyilvános konstruktor közzététele érdekében, amely bemeneti paraméterként fájlelérési útvonalat vesz igénybe.
Private _filePath As String Public Sub New(ByVal filePath As String) _filePath = filePath End SubA(z) GetEnumerator felület
IEnumerable(Of String)metódusának megvalósítása azStreamReaderEnumeratorosztály új példányát adja vissza. A(z)GetEnumeratorinterfészIEnumerablemetódusának implementálásaPrivatelehet, mert csak aIEnumerable(Of String)interfész tagjait kell elérhetővé tenni. Cserélje le a Visual Basic által aGetEnumeratormetódusokhoz létrehozott kódot a következő kódra.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
Az IEnumerator implementálásához szükséges kód hozzáadása
Nyissa meg a StreamReaderEnumerator.vb fájlt.
Írja be a következő sorba, a
Public Class StreamReaderEnumeratorután, és nyomja le az ENTER billentyűt.Implements IEnumerator(Of String)A Visual Basic automatikusan kitölti az osztályt a felület által
IEnumerator(Of String)megkövetelt tagokkal.Az enumerátor osztály megnyitja a szövegfájlt, és végrehajtja az I/O fájlt a fájl sorainak beolvasásához. Adja hozzá a következő kódot az osztályhoz egy nyilvános konstruktor elérhetővé tételéhez, amely bemeneti paraméterként egy fájlelérési útvonalat vesz igénybe, és megnyitja a szövegfájlt olvasásra.
Private _sr As IO.StreamReader Public Sub New(ByVal filePath As String) _sr = New IO.StreamReader(filePath) End SubA
Currentés aIEnumerator(Of String)IEnumeratorfelületek tulajdonságai a jelenlegi elemet adják vissza a szövegfájlból mintString. ACurrentinterfészIEnumeratortulajdonságának megvalósításaPrivatelehet, mert csak aIEnumerator(Of String)interfész tagjait kell elérhetővé tenni. Cserélje le a Visual Basic által aCurrenttulajdonságokhoz létrehozott kódot a következő kódra.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 PropertyA
MoveNextfelület metódusaIEnumeratora szövegfájl következő elemére lép, és frissíti a tulajdonság által visszaadottCurrentértéket. Ha nincs több beolvasandó elem, aMoveNextmetódus visszatérFalse, ellenkező esetben aMoveNextmetódus ad visszaTrue. Adja hozzá a következő kódot aMoveNextmetódushoz:Public Function MoveNext() As Boolean _ Implements System.Collections.IEnumerator.MoveNext _current = _sr.ReadLine() If _current Is Nothing Then Return False Return True End FunctionAz
Resetinterfész metódusaIEnumeratorarra utasítja az iterátort, hogy a szövegfájl elejére mutasson, és törölje az aktuális elemértéket. Adja hozzá a következő kódot aResetmetódushoz:Public Sub Reset() _ Implements System.Collections.IEnumerator.Reset _sr.DiscardBufferedData() _sr.BaseStream.Seek(0, IO.SeekOrigin.Begin) _current = Nothing End SubAz
Disposeinterfész metódusaIEnumeratorgarantálja, hogy az iterátor megsemmisítése előtt minden nem felügyelt erőforrás felszabadul. Az objektum általStreamReaderhasznált fájlleíró nem felügyelt erőforrás, és az iterátorpéldány megsemmisítése előtt le kell zárni. Cserélje le a Visual Basic által generált kódot aDisposemetódushoz a következő kódra.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
A minta iterátor használata
A kódban használhat egy felsorolható osztályt olyan vezérlési struktúrákkal együtt, amelyek implementálnak egy objektumot, például egy IEnumerable hurkot vagy egy LINQ-lekérdezést. Az alábbi példa egy StreamReaderEnumerable LINQ-lekérdezésben látható.
Dim adminRequests =
From line In New StreamReaderEnumerable("..\..\log.txt")
Where line.Contains("admin.aspx 401")
Dim results = adminRequests.ToList()