İ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

  1. Visual Basic'te, Dosya menüsünde Yeni'nin üzerine gelin ve Proje'ye tıklayın.

  2. 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 StreamReaderEnumerableve Tamam'a tıklayın. Yeni proje görüntülenir.

  3. Çö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ı olarak StreamReaderEnumerableyeniden adlandırır. Bu sınıf arabirimini IEnumerable(Of String) uygular.

  4. 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 Stringyazılan değerlere erişebileceğini garanti eder.

IEnumerable uygulamak için kodu ekleme

  1. StreamReaderEnumerable.vb dosyasını açın.

  2. 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.

  3. 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
    
  4. Arabiriminin GetEnumerator yöntemini IEnumerable(Of String) uygulamanız sınıfının yeni bir örneğini StreamReaderEnumerator döndürür. arabiriminin GetEnumerator yönteminin IEnumerable uygulanması yapılabilir Private, çünkü arabirimin yalnızca üyelerini IEnumerable(Of String) kullanıma sunmanız gerekir. Visual Basic'in yöntemler için GetEnumerator 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

  1. StreamReaderEnumerator.vb dosyasını açın.

  2. 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.

  3. 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
    
  4. Current hem hem IEnumerator de IEnumerator(Of String) arabirimlerinin özellikleri, metin dosyasındaki geçerli öğeyi olarak Stringdöndürür. arabiriminin Current özelliğinin IEnumerator uygulanması yapılabilir Private, çünkü arabirimin yalnızca üyelerini IEnumerator(Of String) kullanıma sunmanız gerekir. Visual Basic'in özellikler için Current 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
    
  5. MoveNext arabiriminin IEnumerator yöntemi metin dosyasındaki bir sonraki öğeye gider ve özelliği tarafından Current döndürülen değeri güncelleştirir. Okunacak başka öğe yoksa yöntemi MoveNext döndürür False; aksi takdirde MoveNext yöntemi döndürür True. Aşağıdaki kodu MoveNext 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
    
  6. Reset arabiriminin IEnumerator 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 kodu Reset yöntemine ekleyin.

    Public Sub Reset() _
        Implements System.Collections.IEnumerator.Reset
    
        _sr.DiscardBufferedData()
        _sr.BaseStream.Seek(0, IO.SeekOrigin.Begin)
        _current = Nothing
    End Sub
    
  7. Dispose arabiriminin IEnumerator yöntemi, yineleyici yok edilmeden önce tüm yönetilmeyen kaynakların serbest bırakıldığını garanti eder. Nesnesi tarafından StreamReader 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çin Dispose 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 IEnumerablebir 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()

Ayrıca bkz.