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
Di Visual Basic, pada menu File, arahkan ke Baru, lalu klik Proyek.
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.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 menjadiStreamReaderEnumerable
. Kelas ini akan menerapkan antarmukaIEnumerable(Of String)
.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
Buka file StreamReaderEnumerable.vb.
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)
.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
Penerapan metode GetEnumerator antarmuka
IEnumerable(Of String)
Anda akan menampilkan instansStreamReaderEnumerator
kelas baru. Penerapan metodeGetEnumerator
antarmukaIEnumerable
dapat dibuat sebagaiPrivate
, karena Anda hanya harus memaparkan anggota antarmukaIEnumerable(Of String)
. Ganti kode yang dihasilkan Visual Basic untuk metodeGetEnumerator
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
Buka file StreamReaderEnumerator.vb.
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)
.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
Properti
Current
untuk antarmukaIEnumerator(Of String)
maupunIEnumerator
menampilkan item saat ini dari file teks sebagaiString
. Penerapan propertiCurrent
antarmukaIEnumerator
dapat dibuat sebagaiPrivate
, karena Anda hanya harus memaparkan anggota antarmukaIEnumerator(Of String)
. Ganti kode yang dihasilkan Visual Basic untuk propertiCurrent
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
Metode
MoveNext
dari antarmukaIEnumerator
mengarahkan ke item berikutnya dalam file teks dan memperbarui nilai yang ditampilkan oleh propertiCurrent
. Jika tidak ada lagi item yang dibaca, metodeMoveNext
akan menampilkanFalse
; jika tidak, metodeMoveNext
menampilkanTrue
. Tambahkan kode berikut ke metodeMoveNext
.Public Function MoveNext() As Boolean _ Implements System.Collections.IEnumerator.MoveNext _current = _sr.ReadLine() If _current Is Nothing Then Return False Return True End Function
Metode
Reset
dari antarmukaIEnumerator
mengarahkan pengulang untuk menunjuk ke awal file teks dan membersihkan nilai item saat ini. Tambahkan kode berikut ke metodeReset
.Public Sub Reset() _ Implements System.Collections.IEnumerator.Reset _sr.DiscardBufferedData() _sr.BaseStream.Seek(0, IO.SeekOrigin.Begin) _current = Nothing End Sub
Metode
Dispose
dari antarmukaIEnumerator
menjamin bahwa semua sumber daya tidak terkelola dirilis sebelum pengulang dihancurkan. Handel file yang digunakan oleh objekStreamReader
adalah sumber daya tidak terkelola dan harus ditutup sebelum instans pengulang dihancurkan. Ganti kode yang dihasilkan Visual Basic untuk metodeDispose
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()