İzlenecek yol: Visual Basic'de IEnumerable(Of T) Uygulama

IEnumerable<T>Arabirim, tek seferde bir öğe bir dizi değer döndürebilen sınıflar tarafından uygulanır. Verileri bir kerede bir öğe döndürmesinin avantajı, verilerle çalışmak için tüm veri kümesini belleğe yüklemeniz gerekmez. Verilerden tek bir öğe yüklemek için yeterli bellek kullanmanız gerekir. Arabirimi uygulayan sınıflar, IEnumerable(T) For Each döngüler veya LINQ sorguları ile kullanılabilir.

Örneğin, büyük bir metin dosyasını okuması ve her satırı belirli arama ölçütleriyle eşleşen dosyadan döndürmesi gereken bir uygulamayı düşünün. Uygulama, dosyadan belirtilen ölçütlerle eşleşen satırları döndürmek için bir LINQ sorgusu kullanır. Bir LINQ sorgusu kullanarak dosyanın içeriğini sorgulamak için, uygulama dosyanın içeriğini bir diziye veya koleksiyona yükleyebilir. Ancak, tüm dosyanın bir diziye veya koleksiyona yüklenmesi gerekenden çok daha fazla bellek tüketir. LINQ sorgusu bunun yerine, yalnızca arama ölçütleriyle eşleşen değerleri döndürerek sıralanabilir bir sınıf kullanarak dosya içeriğini sorgulayabilir. Yalnızca birkaç eşleşen değeri döndüren sorgular çok daha az bellek tüketir.

IEnumerable<T>Kaynak verileri sıralanabilir veriler olarak göstermek için arabirimi uygulayan bir sınıf oluşturabilirsiniz. Arabirimi uygulayan sınıfınız, IEnumerable(T) IEnumerator<T> kaynak verilerde yinelemek için arabirimi uygulayan başka bir sınıf gerektirir. Bu iki sınıf, veri öğelerini sırayla belirli bir tür olarak döndürmelerini sağlar.

Bu kılavuzda, arabirimi uygulayan bir sınıf IEnumerable(Of String) ve tek seferde bir IEnumerator(Of String) metin dosyasını okumak için arabirimi uygulayan 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.

Sıralanabilir sınıf oluşturma

Sıralanabilir sınıf projesi oluşturma

  1. Visual Basic, dosya menüsünde, yeni ' nin üzerine gelin ve ardından Project' e tıklayın.

  2. yeni Project iletişim kutusunda, Project türleri bölmesinde Windows seçili olduğundan emin olun. Şablonlar bölmesinde sınıf kitaplığı ' nı seçin. Ad kutusuna yazın StreamReaderEnumerable ve ardından Tamam' a tıklayın. Yeni proje görüntülenir.

  3. Çözüm Gezgini, Class1. vb dosyasına sağ tıklayın ve Yeniden Adlandır' a tıklayın. Dosyayı olarak yeniden adlandırın StreamReaderEnumerable.vb ve ENTER 'a basın. Dosyanın yeniden adlandırılması de sınıfı olarak yeniden adlandırılacaktır StreamReaderEnumerable . Bu sınıf, arabirimini uygular IEnumerable(Of String) .

  4. Streamreadersıralanabilir projeye sağ tıklayın, Ekle' nin üzerine gelin ve ardından Yeni öğe' ye tıklayın. Sınıf şablonunu seçin. Ad kutusuna yazın StreamReaderEnumerator.vb ve Tamam' ı tıklatın.

Bu projedeki ilk sınıf, sıralanabilir sınıftır ve IEnumerable(Of String) arabirimini uygular. Bu genel arabirim arabirimini uygular IEnumerable ve bu sınıfın tüketicilerinin olarak yazılan değerlere erişebilmesini güvence altına alır String .

IEnumerable uygulamak için kodu ekleyin

  1. Streamreadersıralanabilir. vb dosyasını açın.

  2. Sonraki satıra Public Class StreamReaderEnumerable aşağıdakini yazın ve ENTER tuşuna basın.

    Implements IEnumerable(Of String)
    

    Visual Basic, sınıfı otomatik olarak arabirimin gerektirdiği üyelerle doldurur IEnumerable(Of String) .

  3. Bu sıralanabilir sınıf, bir metin dosyasındaki satırları tek seferde bir satır okur. Bir dosya yolunu giriş parametresi olarak alan bir ortak oluşturucuyu açığa çıkarmak için aşağıdaki kodu sınıfına ekleyin.

    Private _filePath As String
    
    Public Sub New(ByVal filePath As String)
        _filePath = filePath
    End Sub
    
  4. Arabirim yöntemi uygulamanız, GetEnumerator IEnumerable(Of String) sınıfının yeni bir örneğini döndürür StreamReaderEnumerator . GetEnumerator IEnumerable Private Yalnızca arabirimin üyelerini kullanıma sunabileceğiniz için arabirim yönteminin uygulanması yapılabilir IEnumerable(Of String) . yöntemler için Visual Basic oluşturulan kodu GetEnumerator 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 ekleyin

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

  2. Sonraki satıra Public Class StreamReaderEnumerator aşağıdakini yazın ve ENTER tuşuna basın.

    Implements IEnumerator(Of String)
    

    Visual Basic, sınıfı otomatik olarak arabirimin gerektirdiği üyelerle doldurur IEnumerator(Of String) .

  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. Bir dosya yolunu giriş parametresi olarak alan ve metin dosyasını okumak için açan bir ortak oluşturucuyu açığa çıkarmak 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. CurrentHem hem de arabirimlerinin özellikleri IEnumerator(Of String) , IEnumerator metin dosyasındaki geçerli öğeyi bir olarak döndürür String . Current IEnumerator Private Yalnızca arabirimin üyelerini kullanıma sunabileceğiniz için arabirimin özelliğinin uygulanması yapılabilir IEnumerator(Of String) . özellikler için Visual Basic oluşturulan kodu Current 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 IEnumerator Arabirim yöntemi metin dosyasındaki bir sonraki öğeye gider ve özelliği tarafından döndürülen değeri günceller Current . Okunacak başka öğe yoksa MoveNext Yöntem döner False ; Aksi takdirde MoveNext Yöntem döndürülür True . MoveNext yöntemine aşağıdaki kodu 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. ResetArabirim yöntemi, IEnumerator yineleyiciyi metin dosyasının başlangıcına işaret etmek için yönlendirir ve geçerli öğe değerini temizler. Reset yöntemine aşağıdaki kodu ekleyin.

    Public Sub Reset() _
        Implements System.Collections.IEnumerator.Reset
    
        _sr.DiscardBufferedData()
        _sr.BaseStream.Seek(0, IO.SeekOrigin.Begin)
        _current = Nothing
    End Sub
    
  7. DisposeArabirim yöntemi, IEnumerator Yineleyici yok etmeden önce tüm yönetilmeyen kaynakların serbest bırakılacağını garanti eder. Nesne tarafından kullanılan dosya tanıtıcısı StreamReader yönetilmeyen bir kaynaktır ve yineleyici örneği yok edileceği için kapatılmalıdır. yöntemi için Visual Basic oluşturulan kodu Dispose 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 Yineleyici kullanma

Kodunuzda IEnumerable , bir For Next döngü veya LINQ sorgusu gibi, uygulayan bir nesne gerektiren denetim yapıları ile birlikte sıralanabilir bir sınıf kullanabilirsiniz. Aşağıdaki örnekte, StreamReaderEnumerable BIR LINQ sorgusunda gösterilmektedir.

Dim adminRequests =
    From line In New StreamReaderEnumerable("..\..\log.txt")
    Where line.Contains("admin.aspx 401")

Dim results = adminRequests.ToList()

Ayrıca bkz.