Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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, LINQ sorguları veya döngüler 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.
Uyarı
Bilgisayarınız, aşağıdaki yönergelerde bazı Visual Studio kullanıcı arabirimi öğeleri 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
StreamReaderEnumerableyazın, ardından Tamam'a tıklayın. Yeni proje görüntülenir.Çözüm Gezgini'nde Class1.vb dosyasına sağ tıklayın ve Yeniden Adlandır'a tıklayın. Dosyayı olarak
StreamReaderEnumerable.vbyeniden adlandırın ve ENTER tuşuna basın. Dosyayı yeniden adlandırmak da sınıfını olarakStreamReaderEnumerableyeniden 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
StreamReaderEnumerator.vbyazın ve OK'ye 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 IEnumerable arabirimini uygular ve bu sınıfın kullanıcılarının String türündeki değerlere erişebilmesini garanti eder.
IEnumerable uygulamak için kodu ekleme
StreamReaderEnumerable.vb dosyasını açın.
sonrasındaki satıra
Public Class StreamReaderEnumerableaş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 SubArabirimdeki GetEnumerator yönteminiz,
IEnumerable(Of String)arabirimini uygularkenStreamReaderEnumeratorsınıfının yeni bir örneğini döndürecektir.GetEnumeratoryöntemi,IEnumerablearayüzünün uygulanmasıPrivateyapılabilir, çünkü yalnızcaIEnumerable(Of String)arayüzünün üyelerini kullanıma sunmanız gerekir. Visual Basic'in yöntemler içinGetEnumeratoroluş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 StreamReaderEnumeratoraş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 dosya G/Ç işlemlerini 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 SubHem
Currenthem deIEnumerator(Of String)arabirimlerininIEnumeratorözellikleri, metin dosyasındaki geçerli öğeyiStringolarak döndürür.CurrentözelliğininIEnumeratorarabirimi uygulanmasıPrivateyapılabilir, çünkü yalnızcaIEnumerator(Of String)arabirimin üyelerini görünür hale getirmeniz gerekir. Visual Basic'in özellikler içinCurrentoluş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 PropertyMoveNextarabirimininIEnumeratoryöntemi metin dosyasındaki bir sonraki öğeye gider veCurrentözelliği tarafından döndürülen değeri günceller. Okunacak başka öğe yoksa yöntemiMoveNextdöndürürFalse; aksi takdirdeMoveNextyöntemi döndürürTrue. Aşağıdaki koduMoveNextmetoduna ekleyin.Public Function MoveNext() As Boolean _ Implements System.Collections.IEnumerator.MoveNext _current = _sr.ReadLine() If _current Is Nothing Then Return False Return True End FunctionResetarabirimininIEnumeratoryö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 koduResetmetoduna ekleyin.Public Sub Reset() _ Implements System.Collections.IEnumerator.Reset _sr.DiscardBufferedData() _sr.BaseStream.Seek(0, IO.SeekOrigin.Begin) _current = Nothing End SubDisposearabirimininIEnumeratoryöntemi, yineleyici yok edilmeden önce tüm yönetilmeyen kaynakların serbest bırakıldığını garanti eder.StreamReadernesnesi tarafından kullanılan dosya tanıtıcısı yönetilmeyen bir kaynak olup yineleyici örneği yok edilmeden önce kapatılmalıdır. Visual Basic'in yöntemi içinDisposeoluş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
Denetim yapıları, döngüler veya LINQ sorguları gibi IEnumerable uygulayan bir nesne gerektirdiğinde, kodunuzda numaralandırılabilir bir For Next sınıf kullanabilirsiniz. Aşağıdaki örnek, bir LINQ sorgusunda StreamReaderEnumerable'nin nasıl kullanıldığını gösterir.
Dim adminRequests =
From line In New StreamReaderEnumerable("..\..\log.txt")
Where line.Contains("admin.aspx 401")
Dim results = adminRequests.ToList()
Ayrıca bakınız
- Visual Basic'da LINQ'e
Giriş - Denetim Akışı
- Döngü Yapıları
- Her Biri İçin...Sonraki Deyimi