Wskazówki: wdrażanie IEnumerable(Of T) w Visual Basic
Artykuł
IEnumerable Interfejsu jest implementowane przez klasy, zwracających sekwencja wartości jeden element naraz.Zwracanie danych jeden element naraz zaletą jest to, że nie trzeba załadować kompletny zestaw danych do pamięci, aby pracować z nim.Trzeba użyć wystarczającej ilości pamięci do załadowania pojedynczego elementu danych.Wdrożenie tej klasy IEnumerable(T) interfejsu może być używany z For Each pętli lub zapytań LINQ.
Rozważmy na przykład aplikacja, która musi odczytać plik tekstowy dużych i każdy wiersz zwrotu z pliku, który odpowiada kryteriom wyszukiwania określonego.Aplikacja używa kwerendy LINQ zwrócić wiersze z pliku, który spełniających określone kryteria.Zbadać zawartość pliku za pomocą kwerendy LINQ, aplikacja może załadować zawartość pliku do tablicy lub zbiór.Załadowanie całego pliku do tablicy lub kolekcji byłoby jednak zajmują znacznie więcej pamięci niż jest to wymagane.Zapytanie LINQ zamiast tego można zbadać zawartość pliku za pomocą klasy agregującym zwracać tylko wartości, które odpowiadają kryteriom wyszukiwania.Kwerendy, które zwracają tylko kilka pasujących wartości byłoby zajmują znacznie mniej pamięci.
Można utworzyć klasy, która implementuje IEnumerable interfejsu narazić źródła danych, jak dane agregującym.Klasy implementujące IEnumerable(T) wymaga innej klasy, która implementuje interfejs IEnumerator interfejsu do iteracji w danych źródłowych.Te dwie klasy umożliwiają powrót sekwencyjnie, jak określony typ elementów danych.
W tym instruktażu utworzy klasy, która implementuje IEnumerable(Of String) interfejs i klasy, która implementuje IEnumerator(Of String) interfejsu odczytu jednej linii pliku tekstowego w czasie.
[!UWAGA]
Na komputerze w poniższych instrukcjach mogą być wyświetlane inne nazwy i lokalizacje niektórych elementów interfejsu użytkownika programu Visual Studio. Te elementy są określane przez numer wersji Visual Studio oraz twoje ustawienia. Aby uzyskać więcej informacji, zobacz Dostosowywanie ustawień środowiska deweloperskiego w Visual Studio.
Tworzenie klasy agregującym
Aby utworzyć projekt agregującym klasy
W Visual Basic, z pliku menu, wskaż Nowy , a następnie kliknij przycisk Projekt.
W Nowy projekt w oknie dialogowym, w Typów projektów okienka, upewnij się, że Windows jest zaznaczone.Wybierz Biblioteka klas w szablonów okienka.W Nazwa wpisz StreamReaderEnumerable, a następnie kliknij przycisk OK.Zostanie wyświetlony nowy projekt.
W Solution Explorer, kliknij prawym przyciskiem myszy plik Class1.vb i kliknij przycisk Zmień nazwę.Zmień nazwę pliku do StreamReaderEnumerable.vb i naciśnij klawisz ENTER.Zmiana nazwy pliku także zmienić klasy do StreamReaderEnumerable.Wprowadzi w życie tej klasy IEnumerable(Of String) interfejsu.
Kliknij prawym przyciskiem myszy projekt StreamReaderEnumerable, wskaż polecenie Dodaj, a następnie kliknij przycisk Nowego elementu.Wybierz klasy szablonu.W Nazwa wpisz StreamReaderEnumerator.vb i kliknij przycisk OK.
Pierwsza klasa w tym projekcie jest klasa agregującym i wprowadzi w życie IEnumerable(Of String) interfejsu.Implementuje ten interfejs generic IEnumerable interfejs i gwarancje, że konsumenci tej klasy mogą uzyskać dostęp do wartości wpisane jako String.
Aby dodać kod do implementować interfejsu IEnumerable
Otwórz plik StreamReaderEnumerable.vb.
W wierszu po Public Class StreamReaderEnumerable, należy wpisać następujące, i naciśnij klawisz ENTER.
Visual Basicautomatycznie wypełni klasy z członków, które są wymagane przez IEnumerable(Of String) interfejsu.
Klasa ta agreguje ustalony odczytać wierszy z pliku tekstowego jeden wiersz naraz.Dodaj następujący kod do klasy narazić konstruktora publicznego, który przyjmuje ścieżkę pliku jako parametr wejściowy.
Implementacji GetEnumerator metoda IEnumerable(Of String) interfejsu zwróci nowe wystąpienie StreamReaderEnumerator klasy.Wykonania GetEnumerator metoda IEnumerable interfejsu można dokonać Private, ponieważ trzeba ujawnić tylko członkowie IEnumerable(Of String) interfejsu.Zastąp kod, Visual Basic generowane dla GetEnumerator metody z następującego kodu.
Visual Basicautomatycznie wypełni klasy z członków, które są wymagane przez IEnumerator(Of String) interfejsu.
Klasy modułu wyliczającego otwiera plik tekstowy i wykonuje plik we/wy, aby odczytać wiersze z pliku.Dodaj następujący kod do klasy narazić konstruktora publicznego, który przyjmuje ścieżkę pliku jako parametr wejściowy i otworzyć plik tekstowy do odczytu.
Current Właściwości dla obu IEnumerator(Of String) i IEnumerator interfejsów zwraca bieżący element w pliku tekstowym jako String.Wykonania Current właściwość IEnumerator interfejsu można dokonać Private, ponieważ trzeba ujawnić tylko członkowie IEnumerator(Of String) interfejsu.Zastąp kod, Visual Basic generowane dla Current właściwości za pomocą następującego kodu.
MoveNext Metoda IEnumerator interfejsu przechodzi do następnego elementu w pliku tekstowym i aktualizuje wartość, która jest zwracana przez Current właściwości.Jeśli brak więcej elementów do odczytu, MoveNext metoda zwraca False; w przeciwnym razie MoveNext metoda zwraca True.Dodaj następujący kod do MoveNext metody.
Reset Metoda IEnumerator interfejsu kieruje iteratora, aby wskazywały na początku pliku tekstowego i czyści bieżące wartości elementu.Dodaj następujący kod do Reset metody.
Dispose Metoda IEnumerator interfejsu gwarantuje, że wszystkie zasoby niezarządzanego są zwolnione, zanim iteratora jest niszczony.Dojście do pliku, który jest używany przez StreamReader obiekt jest niezarządzanego zasobu i musi zostać zamknięty przed instancji iteratora jest niszczony.Zastąp kod, Visual Basic generowane dla Dispose metodę z następującego kodu.
Można użyć klasy agreguje ustalony w kodzie wraz z struktur sterujących, które wymagają obiekt, który implementuje IEnumerable, takich jak For Next pętli lub zapytanie LINQ.W poniższym przykładzie StreamReaderEnumerable w kwerendzie LINQ.
Dim adminRequests =
From line In New StreamReaderEnumerable("..\..\log.txt")
Where line.Contains("admin.aspx 401")
Dim results = adminRequests.ToList()