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
StreamReaderEnumerable
mező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.vb
mező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 String
beí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 StreamReaderEnumerable
utá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 Sub
A(z) GetEnumerator felület
IEnumerable(Of String)
metódusának megvalósítása azStreamReaderEnumerator
osztály új példányát adja vissza. A(z)GetEnumerator
interfészIEnumerable
metódusának implementálásaPrivate
lehet, mert csak aIEnumerable(Of String)
interfész tagjait kell elérhetővé tenni. Cserélje le a Visual Basic által aGetEnumerator
metó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 StreamReaderEnumerator
utá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 Sub
A
Current
és aIEnumerator(Of String)
IEnumerator
felületek tulajdonságai a jelenlegi elemet adják vissza a szövegfájlból mintString
. ACurrent
interfészIEnumerator
tulajdonságának megvalósításaPrivate
lehet, mert csak aIEnumerator(Of String)
interfész tagjait kell elérhetővé tenni. Cserélje le a Visual Basic által aCurrent
tulajdonsá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 Property
A
MoveNext
felület metódusaIEnumerator
a 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, aMoveNext
metódus visszatérFalse
, ellenkező esetben aMoveNext
metódus ad visszaTrue
. Adja hozzá a következő kódot aMoveNext
metódushoz:Public Function MoveNext() As Boolean _ Implements System.Collections.IEnumerator.MoveNext _current = _sr.ReadLine() If _current Is Nothing Then Return False Return True End Function
Az
Reset
interfész metódusaIEnumerator
arra 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 aReset
metódushoz:Public Sub Reset() _ Implements System.Collections.IEnumerator.Reset _sr.DiscardBufferedData() _sr.BaseStream.Seek(0, IO.SeekOrigin.Begin) _current = Nothing End Sub
Az
Dispose
interfész metódusaIEnumerator
garantálja, hogy az iterátor megsemmisítése előtt minden nem felügyelt erőforrás felszabadul. Az objektum általStreamReader
haszná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 aDispose
metó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()