Procedura dettagliata: implementazione di IEnumerable(Of T) in Visual Basic
Articolo
L'interfaccia IEnumerable<T> viene implementata da classi che sono in grado di restituire una sequenza di valori un elemento alla volta.Il vantaggio della restituzione dei dati un elemento alla volta è che non è necessario caricare il set di dati completo in memoria per utilizzarlo.È necessario utilizzare solo la memoria sufficiente per caricare un solo elemento dai dati.Le classi che implementano l'interfaccia IEnumerable(T) possono essere utilizzate con cicli For Each o query LINQ.
Si consideri, ad esempio, un'applicazione che deve leggere un file di testo di grandi dimensioni e restituire ogni riga del file che corrisponde a determinati criteri di ricerca.L'applicazione utilizza una query LINQ per restituire le righe del file corrispondenti ai criteri specificati.Per eseguire una query sul contenuto del file tramite una query LINQ, l'applicazione potrebbe caricare il contenuto del file in una matrice o una raccolta.Tuttavia, il caricamento dell'intero file in una matrice o in una raccolta richiederebbe molta più memoria del necessario.La query LINQ consente invece eseguire una query sul contenuto del file tramite una classe enumerabile, restituendo solo i valori corrispondenti ai criteri di ricerca.Le query che restituiscono solo alcuni valori corrispondenti utilizzeranno molta meno memoria.
È possibile creare una classe che implementa l'interfaccia IEnumerable<T> per esporre i dati di origine come dati enumerabili.La classe che implementa l'interfaccia IEnumerable(T) richiederà un'altra classe che implementa l'interfaccia IEnumerator<T> per scorrere i dati di origine.Queste due classi consentono di restituire elementi di dati in sequenza come tipo specifico.
In questa procedura dettagliata, verrà creata una classe che implementa l'interfaccia IEnumerable(Of String) e una classe che implementa l'interfaccia IEnumerator(Of String) per leggere un file di testo una riga per volta.
[!NOTA]
Nel computer in uso è possibile che vengano visualizzati nomi o percorsi diversi per alcuni elementi dell'interfaccia utente di Visual Studio nelle istruzioni seguenti. La versione di Visual Studio in uso e le impostazioni configurate determinano questi elementi. Per ulteriori informazioni vedere Impostazioni di Visual Studio.
Creazione della classe enumerabile
Per creare il progetto della classe enumerabile
Scegliere Nuovo dal menu File di Visual Basic, quindi fare clic su Progetto.
Nel riquadro Tipi progetto della finestra di dialogo Nuovo progetto verificare che sia selezionata la voce Finestre.Selezionare Libreria di classi nel riquadro Modelli.Nella casella Nome digitare StreamReaderEnumerable, quindi fare clic su OK.Verrà visualizzato il nuovo progetto.
In Esplora soluzioni fare clic con il pulsante destro del mouse sul file Class1.vb e scegliere Rinomina.Assegnare al file il nome StreamReaderEnumerable.vb e premere INVIO.Rinominando il file, anche la classe verrà rinominata StreamReaderEnumerable.Questa classe implementerà l'interfaccia IEnumerable(Of String).
Fare clic con il pulsante destro del mouse sul progetto StreamReaderEnumerable, scegliere Aggiungi, quindi fare clic su Nuovo elemento.Selezionare il modello Classe.Digitare StreamReaderEnumerator.vb nella casella Nome e scegliere OK.
La prima classe di questo progetto è la classe enumerabile che implementerà l'interfaccia IEnumerable(Of String).Questa interfaccia generica implementa l'interfaccia IEnumerable e garantisce che gli utenti di questa classe possano accedere a valori tipizzati come String.
Per aggiungere il codice per implementare IEnumerable
Aprire il file StreamReaderEnumerable.vb.
Nella riga dopo Public Class StreamReaderEnumerable digitare quanto segue e premere INVIO.
In Visual Basic la classe viene automaticamente popolata con i membri richiesti dall'interfaccia IEnumerable(Of String)
Questa classe enumerabile consentirà di leggere le righe da un file di testo una per volta.Aggiungere il codice seguente alla classe per esporre un costruttore pubblico che accetta un percorso di file come parametro di input.
L'implementazione del metodo GetEnumerator dell'interfaccia IEnumerable(Of String) restituirà una nuova istanza della classe StreamReaderEnumerator.L'implementazione del metodo GetEnumerator dell'interfaccia IEnumerable può essere eseguita come Private, perché è necessario esporre solo i membri dell'interfaccia IEnumerable(Of String).Sostituire il codice generato da Visual Basic per i metodi GetEnumerator con il codice seguente.
In Visual Basic la classe viene automaticamente popolata con i membri richiesti dall'interfaccia IEnumerator(Of String)
La classe dell'enumeratore apre il file di testo ed esegue l'I/O di file per leggere le righe dal file.Aggiungere il codice seguente alla classe per esporre un costruttore pubblico che accetta un percorso di file come parametro di input e aprire il file di testo per la lettura.
Le proprietà Current per le interfacce IEnumerator(Of String) e IEnumerator restituiscono l'elemento corrente dal file di testo come String.L'implementazione della proprietà Current dell'interfaccia IEnumerator può essere eseguita come Private, perché è necessario esporre solo i membri dell'interfaccia IEnumerator(Of String).Sostituire il codice generato da Visual Basic per le proprietà Current con il codice seguente.
Il metodo MoveNext dell'interfaccia IEnumerator consente di passare all'elemento successivo nel file di testo e di aggiornare il valore restituito dalla proprietà Current.Se non sono presenti altri elementi da leggere, il metodo MoveNext restituisce False. In caso contrario, il metodo MoveNext restituisce True.Aggiungere al metodo MoveNext il seguente codice.
Il metodo Reset dell'interfaccia IEnumerator consente di indirizzare l'iteratore in modo che faccia riferimento all'inizio del file di testo e di cancellare il valore dell'elemento corrente.Aggiungere al metodo Reset il seguente codice.
Il metodo Dispose dell'interfaccia IEnumerator garantisce che tutte le risorse non gestite vengano rilasciate prima che venga eliminato l'iteratore.L'handle di file utilizzato dall'oggetto StreamReader è una risorsa non gestita e deve essere chiuso prima che venga eliminata l'istanza dell'iteratore.Sostituire il codice generato da Visual Basic per il metodo Dispose con il codice seguente.
È possibile utilizzare una classe enumerabile nel codice insieme alle strutture di controllo che richiedono un oggetto che implementa IEnumerable, quale un ciclo For Next o una query LINQ.Nell'esempio seguente viene illustrato StreamReaderEnumerable in una query LINQ.
Dim adminRequests =
From line In New StreamReaderEnumerable("..\..\log.txt")
Where line.Contains("admin.aspx 401")
Dim results = adminRequests.ToList()