Bagikan melalui


Panduan: Menerapkan IEnumerable(Of T) di Visual Basic

Antarmuka IEnumerable<T> diimplementasikan oleh kelas yang dapat mengembalikan urutan nilai satu item pada satu waktu. Keuntungan mengembalikan data satu item pada satu waktu adalah Anda tidak perlu memuat kumpulan data lengkap ke dalam memori untuk bekerja dengannya. Anda hanya perlu menggunakan memori yang cukup untuk memuat satu item dari data. Kelas yang mengimplementasikan IEnumerable(T) antarmuka dapat digunakan dengan For Each perulangan atau kueri LINQ.

Misalnya, pertimbangkan aplikasi yang harus membaca file teks besar dan mengembalikan setiap baris dari file yang cocok dengan kriteria pencarian tertentu. Aplikasi menggunakan kueri LINQ untuk mengembalikan baris dari file yang cocok dengan kriteria yang ditentukan. Untuk mengkueri konten file dengan menggunakan kueri LINQ, aplikasi dapat memuat konten file ke dalam array atau koleksi. Namun, memuat seluruh file ke dalam array atau koleksi akan mengonsumsi memori yang jauh lebih banyak daripada yang diperlukan. Kueri LINQ dapat mengkueri konten file dengan menggunakan kelas yang dapat dijumlahkan, hanya mengembalikan nilai yang cocok dengan kriteria pencarian. Kueri yang hanya mengembalikan beberapa nilai yang cocok akan mengonsumsi memori yang jauh lebih sedikit.

Anda dapat membuat kelas yang mengimplementasikan IEnumerable<T> antarmuka untuk mengekspos data sumber sebagai data yang dapat dijumlahkan. Kelas Anda yang mengimplementasikan IEnumerable(T) antarmuka akan memerlukan kelas lain yang mengimplementasikan IEnumerator<T> antarmuka untuk melakukan iterasi melalui data sumber. Kedua kelas ini memungkinkan Anda mengembalikan item data secara berurutan sebagai jenis tertentu.

Dalam panduan ini, Anda akan membuat kelas yang mengimplementasikan IEnumerable(Of String) antarmuka dan kelas yang mengimplementasikan IEnumerator(Of String) antarmuka untuk membaca file teks satu baris pada satu waktu.

Nota

Komputer Anda mungkin menampilkan nama atau lokasi yang berbeda untuk beberapa elemen antarmuka pengguna Visual Studio dalam instruksi berikut. Edisi Visual Studio yang Anda miliki dan pengaturan yang Anda gunakan menentukan elemen-elemen ini. Untuk informasi lebih lanjut, lihat Mempersonalisasi IDE.

Membuat kelas Enumerable

Membuat proyek kelas yang dapat dijumlahkan

  1. Di Visual Basic, pada menu File , arahkan ke Baru lalu klik Proyek.

  2. Dalam kotak dialog Proyek Baru, di panel Tipe Proyek, pastikan Windows dipilih. Pilih Pustaka Kelas di panel Templat . Dalam kotak Nama , ketik StreamReaderEnumerable, lalu klik OK. Proyek baru telah ditampilkan.

  3. Di Penjelajah Solusi, klik kanan file Class1.vb dan klik Ganti Nama. Ganti nama file menjadi StreamReaderEnumerable.vb dan tekan ENTER. Mengganti nama file juga akan mengganti nama kelas menjadi StreamReaderEnumerable. Kelas ini akan mengimplementasikan IEnumerable(Of String) antarmuka.

  4. Klik kanan proyek StreamReaderEnumerable, arahkan ke Tambahkan, lalu klik Item Baru. Pilih templat Kelas . Dalam kotak Nama , ketik StreamReaderEnumerator.vb dan klik OK.

Kelas pertama dalam proyek ini adalah kelas enumerable dan akan mengimplementasikan IEnumerable(Of String) antarmuka. Antarmuka generik ini mengimplementasikan IEnumerable antarmuka dan menjamin bahwa konsumen kelas ini dapat mengakses nilai yang ditik sebagai String.

Menambahkan kode untuk mengimplementasikan IEnumerable

  1. Buka file StreamReaderEnumerable.vb.

  2. Pada baris setelah Public Class StreamReaderEnumerable, ketik berikut ini dan tekan ENTER.

    Implements IEnumerable(Of String)
    

    Visual Basic secara otomatis mengisi kelas dengan anggota yang diperlukan oleh IEnumerable(Of String) antarmuka.

  3. Kelas yang dapat dijumlahkan ini akan membaca baris dari file teks satu baris pada satu waktu. Tambahkan kode berikut ke kelas untuk mengekspos konstruktor publik yang mengambil jalur file sebagai parameter input.

    Private _filePath As String
    
    Public Sub New(ByVal filePath As String)
        _filePath = filePath
    End Sub
    
  4. Implementasi metode GetEnumerator dari antarmuka IEnumerable(Of String) Anda akan mengembalikan instance kelas StreamReaderEnumerator yang baru. Implementasi metode GetEnumerator antarmuka IEnumerable dapat dibuat Private, karena Anda hanya harus mengekspos anggota-anggota antarmuka IEnumerable(Of String). Ganti kode yang dihasilkan Visual Basic untuk GetEnumerator metode dengan kode berikut.

    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
    

Menambahkan kode untuk mengimplementasikan IEnumerator

  1. Buka file StreamReaderEnumerator.vb.

  2. Pada baris setelah Public Class StreamReaderEnumerator, ketik berikut ini dan tekan ENTER.

    Implements IEnumerator(Of String)
    

    Visual Basic secara otomatis mengisi kelas dengan anggota yang diperlukan oleh IEnumerator(Of String) antarmuka.

  3. Kelas enumerator membuka file teks dan melakukan I/O file untuk membaca baris dari file. Tambahkan kode berikut ke kelas untuk mengekspos konstruktor publik yang mengambil jalur file sebagai parameter input dan membuka file teks untuk dibaca.

    Private _sr As IO.StreamReader
    
    Public Sub New(ByVal filePath As String)
        _sr = New IO.StreamReader(filePath)
    End Sub
    
  4. Properti Current untuk antarmuka IEnumerator(Of String) dan IEnumerator mengembalikan item saat ini dari file teks sebagai String. Implementasi properti Current dari antarmuka IEnumerator dapat dibuat Private, karena Anda harus hanya mengekspos anggota dari antarmuka IEnumerator(Of String). Ganti kode yang dihasilkan Visual Basic untuk Current properti dengan kode berikut.

    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. Metode MoveNext dari antarmuka IEnumerator menavigasi ke elemen berikutnya dalam berkas teks dan memperbarui nilai yang dikembalikan oleh properti Current. Jika tidak ada lagi item untuk dibaca, metode MoveNext akan mengembalikan False; jika tidak, metode MoveNext akan mengembalikan True. Tambahkan kode berikut ke metode MoveNext.

    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. Metode Reset dari antarmuka IEnumerator mengarahkan iterator untuk menunjuk ke awal file teks dan mengatur ulang nilai item saat ini. Tambahkan kode berikut ke metode Reset.

    Public Sub Reset() _
        Implements System.Collections.IEnumerator.Reset
    
        _sr.DiscardBufferedData()
        _sr.BaseStream.Seek(0, IO.SeekOrigin.Begin)
        _current = Nothing
    End Sub
    
  7. Metode Dispose dari antarmuka IEnumerator menjamin bahwa semua sumber daya tak terkelola dirilis sebelum iterator dihancurkan. Handel file yang digunakan oleh StreamReader objek adalah sumber daya yang tidak dikelola dan harus ditutup sebelum instans iterator dihancurkan. Ganti kode yang dihasilkan Visual Basic untuk Dispose metode dengan kode berikut.

    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
    

Menggunakan Iterator Sampel

Anda dapat menggunakan kelas yang dapat dijumlahkan dalam kode Anda bersama dengan struktur kontrol yang memerlukan objek yang mengimplementasikan IEnumerable, seperti For Next perulangan atau kueri LINQ. Contoh berikut menunjukkan StreamReaderEnumerable dalam kueri LINQ.

Dim adminRequests =
    From line In New StreamReaderEnumerable("..\..\log.txt")
    Where line.Contains("admin.aspx 401")

Dim results = adminRequests.ToList()

Lihat juga