İ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
Visual Basic, dosya menüsünde, yeni ' nin üzerine gelin ve ardından Project' e tıklayın.
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
StreamReaderEnumerableve ardından Tamam' a tıklayın. Yeni proje görüntülenir.Çö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.vbve ENTER 'a basın. Dosyanın yeniden adlandırılması de sınıfı olarak yeniden adlandırılacaktırStreamReaderEnumerable. Bu sınıf, arabirimini uygularIEnumerable(Of String).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.vbve 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
Streamreadersıralanabilir. vb dosyasını açın.
Sonraki satıra
Public Class StreamReaderEnumerableaş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).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 SubArabirim yöntemi uygulamanız, GetEnumerator
IEnumerable(Of String)sınıfının yeni bir örneğini döndürürStreamReaderEnumerator.GetEnumeratorIEnumerablePrivateYalnızca arabirimin üyelerini kullanıma sunabileceğiniz için arabirim yönteminin uygulanması yapılabilirIEnumerable(Of String). yöntemler için Visual Basic oluşturulan koduGetEnumeratoraş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
StreamReaderEnumerator. vb dosyasını açın.
Sonraki satıra
Public Class StreamReaderEnumeratoraş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).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 SubCurrentHem hem de arabirimlerinin özellikleriIEnumerator(Of String),IEnumeratormetin dosyasındaki geçerli öğeyi bir olarak döndürürString.CurrentIEnumeratorPrivateYalnızca arabirimin üyelerini kullanıma sunabileceğiniz için arabirimin özelliğinin uygulanması yapılabilirIEnumerator(Of String). özellikler için Visual Basic oluşturulan koduCurrentaş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 PropertyMoveNextIEnumeratorArabirim yöntemi metin dosyasındaki bir sonraki öğeye gider ve özelliği tarafından döndürülen değeri güncellerCurrent. Okunacak başka öğe yoksaMoveNextYöntem dönerFalse; Aksi takdirdeMoveNextYöntem döndürülürTrue.MoveNextyö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 FunctionResetArabirim yöntemi,IEnumeratoryineleyiciyi metin dosyasının başlangıcına işaret etmek için yönlendirir ve geçerli öğe değerini temizler.Resetyö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 SubDisposeArabirim yöntemi,IEnumeratorYineleyici 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ıStreamReaderyö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 koduDisposeaş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()