Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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
Di Visual Basic, pada menu File , arahkan ke Baru lalu klik Proyek.
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.Di Penjelajah Solusi, klik kanan file Class1.vb dan klik Ganti Nama. Ganti nama file menjadi
StreamReaderEnumerable.vbdan tekan ENTER. Mengganti nama file juga akan mengganti nama kelas menjadiStreamReaderEnumerable. Kelas ini akan mengimplementasikanIEnumerable(Of String)antarmuka.Klik kanan proyek StreamReaderEnumerable, arahkan ke Tambahkan, lalu klik Item Baru. Pilih templat Kelas . Dalam kotak Nama , ketik
StreamReaderEnumerator.vbdan 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
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
IEnumerable(Of String)antarmuka.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 SubImplementasi metode GetEnumerator dari antarmuka
IEnumerable(Of String)Anda akan mengembalikan instance kelasStreamReaderEnumeratoryang baru. Implementasi metodeGetEnumeratorantarmukaIEnumerabledapat dibuatPrivate, karena Anda hanya harus mengekspos anggota-anggota antarmukaIEnumerable(Of String). Ganti kode yang dihasilkan Visual Basic untukGetEnumeratormetode 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
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
IEnumerator(Of String)antarmuka.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 SubProperti
Currentuntuk antarmukaIEnumerator(Of String)danIEnumeratormengembalikan item saat ini dari file teks sebagaiString. Implementasi propertiCurrentdari antarmukaIEnumeratordapat dibuatPrivate, karena Anda harus hanya mengekspos anggota dari antarmukaIEnumerator(Of String). Ganti kode yang dihasilkan Visual Basic untukCurrentproperti 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 PropertyMetode
MoveNextdari antarmukaIEnumeratormenavigasi ke elemen berikutnya dalam berkas teks dan memperbarui nilai yang dikembalikan oleh propertiCurrent. Jika tidak ada lagi item untuk dibaca, metodeMoveNextakan mengembalikanFalse; jika tidak, metodeMoveNextakan mengembalikanTrue. 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 FunctionMetode
Resetdari antarmukaIEnumeratormengarahkan iterator untuk menunjuk ke awal file teks dan mengatur ulang 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 SubMetode
Disposedari antarmukaIEnumeratormenjamin bahwa semua sumber daya tak terkelola dirilis sebelum iterator dihancurkan. Handel file yang digunakan olehStreamReaderobjek adalah sumber daya yang tidak dikelola dan harus ditutup sebelum instans iterator dihancurkan. Ganti kode yang dihasilkan Visual Basic untukDisposemetode 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()