İzlenecek yol: Visual Basic'de IEnumerable(Of T) Uygulama
IEnumerable<T> Arabirim, bir kerede bir öğeye değer dizisi döndürebilen sınıflar tarafından uygulanır. Verileri bir kerede bir öğe döndürmenin avantajı, veri kümesinin tamamını birlikte çalışmak için belleğe yüklemeniz gerekmemesidir. Verilerden tek bir öğeyi yüklemek için yalnızca yeterli bellek kullanmanız gerekir. Arabirimi uygulayan IEnumerable(T)
sınıflar döngüler veya LINQ sorguları ile For Each
kullanılabilir.
Örneğin, büyük bir metin dosyasını okuması ve dosyadan belirli arama ölçütleri ile eşleşen her satırı döndürmesi gereken bir uygulama düşünün. Uygulama, belirtilen ölçütlerle eşleşen dosyadan satır döndürmek için bir LINQ sorgusu kullanır. LinQ sorgusu kullanarak dosyanın içeriğini sorgulamak için uygulama dosyanın içeriğini bir diziye veya koleksiyona yükleyebilir. Ancak, dosyanın tamamını bir diziye veya koleksiyona yüklemek gerekenden çok daha fazla bellek tüketir. LINQ sorgusu bunun yerine, yalnızca arama ölçütleriyle eşleşen değerleri döndüren numaralandırılabilir bir sınıf kullanarak dosya içeriğini sorgulayabilir. Yalnızca birkaç eşleşen değer döndüren sorgular çok daha az bellek tüketir.
Kaynak verileri numaralandırılabilir veri olarak kullanıma sunan arabirimini uygulayan IEnumerable<T> bir sınıf oluşturabilirsiniz. Arabirimini uygulayan IEnumerable(T)
sınıfınız, kaynak verilerde IEnumerator<T> yineleme yapmak için arabirimi uygulayan başka bir sınıf gerektirir. Bu iki sınıf, veri öğelerini belirli bir tür olarak sıralı olarak döndürmenizi sağlar.
Bu kılavuzda, arabirimini uygulayan IEnumerable(Of String)
bir sınıf ve bir metin dosyasını bir kerede bir satır okumak için arabirimini uygulayan IEnumerator(Of String)
bir sınıf oluşturacaksınız.
Not
Bilgisayarınız, aşağıdaki yönergelerde yer alan Visual Studio kullanıcı arabirimi öğelerinden bazıları için farklı adlar veya konumlar gösterebilir. Sahip olduğunuz Visual Studio sürümü ve kullandığınız ayarlar bu öğeleri belirler. Daha fazla bilgi için bkz. IDE’yi kişiselleştirme.
Numaralandırılabilir Sınıfı Oluşturma
Numaralandırılabilir sınıf projesini oluşturma
Visual Basic'te, Dosya menüsünde Yeni'nin üzerine gelin ve Proje'ye tıklayın.
Yeni Proje iletişim kutusundaki Proje Türleri bölmesinde Windows'un seçili olduğundan emin olun. Şablonlar bölmesinde Sınıf Kitaplığı'nı seçin. Ad kutusuna yazın
StreamReaderEnumerable
ve Tamam'a tıklayın. Yeni proje görüntülenir.Çözüm Gezgini'da, Class1.vb dosyasına sağ tıklayın ve Yeniden Adlandır'a tıklayın. Dosyayı olarak
StreamReaderEnumerable.vb
yeniden adlandırın ve ENTER tuşuna basın. Dosyayı yeniden adlandırmak da sınıfını olarakStreamReaderEnumerable
yeniden adlandırır. Bu sınıf arabiriminiIEnumerable(Of String)
uygular.StreamReaderEnumerable projesine sağ tıklayın, Ekle'nin üzerine gelin ve Yeni Öğe'ye tıklayın. Sınıf şablonunu seçin. Ad kutusuna yazın
StreamReaderEnumerator.vb
ve Tamam'a tıklayın.
Bu projenin ilk sınıfı numaralandırılabilir sınıfıdır ve arabirimini IEnumerable(Of String)
uygular. Bu genel arabirim arabirimini IEnumerable uygular ve bu sınıfın tüketicilerinin olarak String
yazılan değerlere erişebileceğini garanti eder.
IEnumerable uygulamak için kodu ekleme
StreamReaderEnumerable.vb dosyasını açın.
sonrasındaki satıra
Public Class StreamReaderEnumerable
aşağıdakileri yazın ve ENTER tuşuna basın.Implements IEnumerable(Of String)
Visual Basic, sınıfı arabiriminin gerektirdiği
IEnumerable(Of String)
üyelerle otomatik olarak doldurur.Bu numaralandırılabilir sınıf, bir metin dosyasındaki satırları birer birer okur. Giriş parametresi olarak dosya yolu alan bir ortak oluşturucuyu kullanıma açmak için sınıfına aşağıdaki kodu ekleyin.
Private _filePath As String Public Sub New(ByVal filePath As String) _filePath = filePath End Sub
Arabiriminin GetEnumerator yöntemini
IEnumerable(Of String)
uygulamanız sınıfının yeni bir örneğiniStreamReaderEnumerator
döndürür. arabirimininGetEnumerator
yöntemininIEnumerable
uygulanması yapılabilirPrivate
, çünkü arabirimin yalnızca üyeleriniIEnumerable(Of String)
kullanıma sunmanız gerekir. Visual Basic'in yöntemler içinGetEnumerator
oluşturduğu kodu aşağıdaki kodla değiştirin.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
IEnumerator'ı uygulamak için kodu ekleme
StreamReaderEnumerator.vb dosyasını açın.
sonrasındaki satıra
Public Class StreamReaderEnumerator
aşağıdakileri yazın ve ENTER tuşuna basın.Implements IEnumerator(Of String)
Visual Basic, sınıfı arabiriminin gerektirdiği
IEnumerator(Of String)
üyelerle otomatik olarak doldurur.Numaralandırıcı sınıfı metin dosyasını açar ve dosyadaki satırları okumak için G/Ç dosyasını gerçekleştirir. Giriş parametresi olarak dosya yolu alan ve metin dosyasını okumak üzere açan bir ortak oluşturucuyu kullanıma açmak için sınıfına aşağıdaki kodu ekleyin.
Private _sr As IO.StreamReader Public Sub New(ByVal filePath As String) _sr = New IO.StreamReader(filePath) End Sub
Current
hem hemIEnumerator
deIEnumerator(Of String)
arabirimlerinin özellikleri, metin dosyasındaki geçerli öğeyi olarakString
döndürür. arabirimininCurrent
özelliğininIEnumerator
uygulanması yapılabilirPrivate
, çünkü arabirimin yalnızca üyeleriniIEnumerator(Of String)
kullanıma sunmanız gerekir. Visual Basic'in özellikler içinCurrent
oluşturduğu kodu aşağıdaki kodla değiştirin.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
MoveNext
arabirimininIEnumerator
yöntemi metin dosyasındaki bir sonraki öğeye gider ve özelliği tarafındanCurrent
döndürülen değeri güncelleştirir. Okunacak başka öğe yoksa yöntemiMoveNext
döndürürFalse
; aksi takdirdeMoveNext
yöntemi döndürürTrue
. Aşağıdaki koduMoveNext
yöntemine ekleyin.Public Function MoveNext() As Boolean _ Implements System.Collections.IEnumerator.MoveNext _current = _sr.ReadLine() If _current Is Nothing Then Return False Return True End Function
Reset
arabirimininIEnumerator
yöntemi, yineleyiciyi metin dosyasının başlangıcını işaret etmeye yönlendirir ve geçerli öğe değerini temizler. Aşağıdaki koduReset
yöntemine ekleyin.Public Sub Reset() _ Implements System.Collections.IEnumerator.Reset _sr.DiscardBufferedData() _sr.BaseStream.Seek(0, IO.SeekOrigin.Begin) _current = Nothing End Sub
Dispose
arabirimininIEnumerator
yöntemi, yineleyici yok edilmeden önce tüm yönetilmeyen kaynakların serbest bırakıldığını garanti eder. Nesnesi tarafındanStreamReader
kullanılan dosya tanıtıcısı yönetilmeyen bir kaynaktır ve yineleyici örneği yok edilmeden önce kapatılmalıdır. Visual Basic'in yöntemi içinDispose
oluşturduğu kodu aşağıdaki kodla değiştirin.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
Örnek Yineleyiciyi Kullanma
Döngü veya LINQ sorgusu gibi uygulayan IEnumerable
bir nesne gerektiren denetim yapıları ile birlikte kodunuzda numaralandırılabilir bir For Next
sınıf kullanabilirsiniz. Aşağıdaki örnek, linq sorgusunda öğesini StreamReaderEnumerable
gösterir.
Dim adminRequests =
From line In New StreamReaderEnumerable("..\..\log.txt")
Where line.Contains("admin.aspx 401")
Dim results = adminRequests.ToList()