Megosztás a következőn keresztül:


Útmutató: IEnumerable(Of T) implementálása a Visual Basicben

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

  1. A Visual Basic Fájl menüjében mutasson az Új pontra, majd kattintson a Project gombra.

  2. 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.

  3. 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őre StreamReaderEnumerable: . Ez az osztály implementálja a IEnumerable(Of String) felületet.

  4. 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 Stringbeírt értékekhez.

Adja hozzá a kódot az IEnumerable implementálásához

  1. Nyissa meg a StreamReaderEnumerable.vb fájlt.

  2. Í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.

  3. 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
    
  4. A(z) GetEnumerator felület IEnumerable(Of String) metódusának megvalósítása az StreamReaderEnumerator osztály új példányát adja vissza. A(z) GetEnumerator interfész IEnumerable metódusának implementálása Private lehet, mert csak a IEnumerable(Of String) interfész tagjait kell elérhetővé tenni. Cserélje le a Visual Basic által a GetEnumerator 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

  1. Nyissa meg a StreamReaderEnumerator.vb fájlt.

  2. Í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.

  3. 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
    
  4. A Current és a IEnumerator(Of String)IEnumerator felületek tulajdonságai a jelenlegi elemet adják vissza a szövegfájlból mint String. A Current interfész IEnumerator tulajdonságának megvalósítása Private lehet, mert csak a IEnumerator(Of String) interfész tagjait kell elérhetővé tenni. Cserélje le a Visual Basic által a Current 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
    
  5. A MoveNext felület metódusa IEnumerator a szövegfájl következő elemére lép, és frissíti a tulajdonság által visszaadott Current értéket. Ha nincs több beolvasandó elem, a MoveNext metódus visszatér False, ellenkező esetben a MoveNext metódus ad vissza True. Adja hozzá a következő kódot a MoveNext 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
    
  6. Az Reset interfész metódusa IEnumerator 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 a Reset metódushoz:

    Public Sub Reset() _
        Implements System.Collections.IEnumerator.Reset
    
        _sr.DiscardBufferedData()
        _sr.BaseStream.Seek(0, IO.SeekOrigin.Begin)
        _current = Nothing
    End Sub
    
  7. Az Dispose interfész metódusa IEnumerator garantálja, hogy az iterátor megsemmisítése előtt minden nem felügyelt erőforrás felszabadul. Az objektum által StreamReader 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 a Dispose 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()

Lásd még