Penerapan IEnumerable(Of T) dalam Visual Basic

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

Misalnya, pertimbangkan aplikasi yang harus membaca file teks besar dan menampilkan setiap baris dari file yang cocok dengan kriteria pencarian tertentu. Aplikasi menggunakan kueri LINQ untuk menampilkan 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. Akan tetapi, pemuatan seluruh file ke dalam array atau koleksi akan menghabiskan memori yang jauh lebih banyak daripada yang diperlukan. Kueri LINQ dapat mengkueri konten file dengan menggunakan kelas yang dapat dijumlahkan, yang hanya menampilkan nilai yang cocok dengan kriteria pencarian. Kueri yang hanya menampilkan beberapa nilai yang cocok akan menghabiskan memori yang jauh lebih sedikit.

Anda dapat membuat kelas yang menerapkan antarmuka IEnumerable<T> untuk memaparkan data sumber sebagai data yang dapat dijumlahkan. Kelas Anda yang menerapkan antarmuka IEnumerable(T) akan memerlukan kelas lain yang menerapkan antarmuka IEnumerator<T> untuk mengulang melalui data sumber. Kedua kelas ini memungkinkan Anda menampilkan item data secara berurutan sebagai jenis tertentu.

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

Catatan

Komputer Anda mungkin memperlihatkan nama atau lokasi yang berbeda untuk beberapa elemen antarmuka pengguna Visual Studio dalam petunjuk berikut. Edisi Visual Studio yang Anda miliki dan setelan yang Anda gunakan menentukan elemen-elemen ini. Untuk informasi selengkapnya, lihat Mempersonalisasi IDE.

Pembuatan Kelas yang Dapat Dijumlahkan

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 dalam panel Jenis Proyek, pastikan apakah Windows terpilih. Pilih Pustaka Kelas dalam panel Templat. Dalam kotak Nama, ketik StreamReaderEnumerable, lalu klik OK. Proyek baru ditampilkan.

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

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

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

Menambahkan kode untuk menerapkan 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 antarmuka IEnumerable(Of String).

  3. Kelas yang dapat dijumlahkan ini akan membaca baris dari file teks satu baris pada satu waktu. Tambahkan kode berikut ke kelas untuk memaparkan 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. Penerapan metode GetEnumerator antarmuka IEnumerable(Of String) Anda akan menampilkan instans StreamReaderEnumerator kelas baru. Penerapan metode GetEnumerator antarmuka IEnumerable dapat dibuat sebagai Private, karena Anda hanya harus memaparkan anggota antarmuka IEnumerable(Of String). Ganti kode yang dihasilkan Visual Basic untuk metode GetEnumerator 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 menerapkan 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 antarmuka IEnumerator(Of String).

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

    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) maupun IEnumerator menampilkan item saat ini dari file teks sebagai String. Penerapan properti Current antarmuka IEnumerator dapat dibuat sebagai Private, karena Anda hanya harus memaparkan anggota antarmuka IEnumerator(Of String). Ganti kode yang dihasilkan Visual Basic untuk properti Current 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 mengarahkan ke item berikutnya dalam file teks dan memperbarui nilai yang ditampilkan oleh properti Current. Jika tidak ada lagi item yang dibaca, metode MoveNext akan menampilkan False; jika tidak, metode MoveNext menampilkan 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 pengulang untuk menunjuk ke awal file teks dan membersihkan 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 tidak terkelola dirilis sebelum pengulang dihancurkan. Handel file yang digunakan oleh objek StreamReader adalah sumber daya tidak terkelola dan harus ditutup sebelum instans pengulang dihancurkan. Ganti kode yang dihasilkan Visual Basic untuk metode Dispose 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
    

Penggunaan Pengulang Sampel

Anda dapat menggunakan kelas yang dapat dijumlahkan dalam kode Anda bersama dengan struktur kontrol yang memerlukan objek yang menerapkan IEnumerable, seperti perulangan For Next 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