Procédure pas à pas : implémentation d'IEnumerable(Of T) en Visual Basic
Article
L'interface IEnumerable est implémentée par les classes qui peuvent retourner une séquence de valeurs élément par élément. L'avantage du retour de données élément par élément est que vous n'avez pas à charger le groupe de données complet dans la mémoire pour l'utiliser. Vous devez simplement utiliser la mémoire nécessaire au chargement d'un seul élément à partir des données. Les classes qui implémentent l'interface IEnumerable(T) peuvent être utilisées avec les boucles For Each ou les requêtes LINQ.
Par exemple, prenez une application qui doit lire un fichier texte volumineux et retourner chaque ligne du fichier correspondant aux critères de recherche particuliers. L'application utilise une requête LINQ pour retourner les lignes du fichier qui correspondent aux critères spécifiés. Pour interroger le contenu du fichier à l'aide d'une requête LINQ, l'application pourrait charger le contenu du fichier dans un tableau ou une collection. Toutefois, le chargement du fichier tout entier dans un tableau ou une collection consommerait beaucoup plus de mémoire que nécessaire. La requête LINQ pourrait à la place interroger le contenu du fichier à l'aide d'une classe énumérable, en retournant uniquement les valeurs correspondant aux critères de recherche. Les requêtes qui retournent uniquement quelques valeurs correspondantes consommeraient beaucoup moins de mémoire.
Vous pouvez créer une classe qui implémente l'interface IEnumerable pour exposer des données sources comme données énumérables. Votre classe qui implémente l'interface IEnumerable(T) demandera une autre classe implémentant l'interface IEnumerator pour effectuer une itération au sein des données sources. Ces deux classes vous permettent de retourner séquentiellement des éléments de données comme type spécifique.
Dans cette procédure pas à pas, vous allez créer une classe qui implémente l'interface IEnumerable(Of String) et une classe qui implémente l'interface IEnumerator(Of String) pour lire un fichier texte ligne par ligne.
Notes
Il est possible que pour certains des éléments de l'interface utilisateur de Visual Studio, votre ordinateur affiche des noms ou des emplacements différents de ceux indiqués dans les instructions suivantes. L'édition de Visual Studio dont vous disposez et les paramètres que vous utilisez déterminent ces éléments. Pour plus d'informations, voir Paramètres Visual Studio.
Création de la classe énumérable
Pour créer le projet de classe énumérable
Dans Visual Basic, dans le menu Fichier, pointez sur Nouveau, puis cliquez sur Projet.
Dans la boîte de dialogue Nouveau projet, dans le volet Types de projets, vérifiez que Windows est sélectionné. Sélectionnez Bibliothèque de classes dans le volet Modèles. Dans la zone Nom, tapez StreamReaderEnumerable, puis cliquez sur OK. Le nouveau projet s'affiche.
Dans l'Explorateur de solutions, cliquez avec le bouton droit sur le fichier Class1.vb, puis cliquez sur Renommer. Renommez le fichier en StreamReaderEnumerable.vb et appuyez sur ENTRÉE. Lorsque vous renommez le fichier, la classe sera également renommée en StreamReaderEnumerable. Cette classe implémentera l'interface IEnumerable(Of String).
Cliquez avec le bouton droit sur le projet StreamReaderEnumerable, pointez sur Ajouter, puis cliquez sur Nouvel élément. Sélectionnez le modèle Classe. Dans la zone Nom, tapez StreamReaderEnumerator.vb et cliquez sur OK.
La première classe dans ce projet est la classe énumérable qui implémentera l'interface IEnumerable(Of String). Cette interface générique implémente l'interface IEnumerable et garantit que les consommateurs de cette classe peuvent accéder aux valeurs de type String.
Pour ajouter le code pour implémenter IEnumerable
Ouvrez le fichier StreamReaderEnumerable.vb.
Sur la ligne suivant Public Class StreamReaderEnumerable, tapez ce qui suit et appuyez sur ENTRÉE.
Visual Basic remplit automatiquement la classe avec les membres requis par l'interface IEnumerable(Of String)
Cette classe énumérable lira les lignes d'un fichier texte une par une. Ajoutez le code suivant à la classe pour exposer un constructeur public prenant un chemin d'accès de fichier comme paramètre d'entrée.
Votre implémentation de la méthode GetEnumerator de l'interface IEnumerable(Of String) retournera une nouvelle instance de la classe StreamReaderEnumerator. L'implémentation de la méthode GetEnumerator de l'interface IEnumerable peut devenir Private car vous ne devez exposer que les membres de l'interface IEnumerable(Of String). Remplacez le code généré par Visual Basic pour les méthodes GetEnumerator par le code suivant.
Visual Basic remplit automatiquement la classe avec les membres requis par l'interface IEnumerator(Of String)
La classe d'énumérateur ouvre le fichier texte et exécute l'E/S de fichier pour lire les lignes du fichier. Ajoutez le code suivant à la classe pour exposer un constructeur public prenant un chemin d'accès de fichier comme paramètre d'entrée et ouvrez le fichier texte pour la lecture.
Les propriétés Current pour les interfaces IEnumerator(Of String) et IEnumerator retournent l'élément actuel du fichier texte comme String. L'implémentation de la propriété Current de l'interface IEnumerator peut devenir Private car vous ne devez exposer que les membres de l'interface IEnumerator(Of String). Remplacez le code généré par Visual Basic pour les propriétés Current par le code suivant.
La méthode MoveNext de l'interface IEnumerator navigue jusqu'à l'élément suivant du fichier texte et met à jour la valeur retournée par la propriété Current. Si le fichier ne contient aucun élément à lire, la méthode MoveNext retourne la valeur False ; sinon, la méthode MoveNext retourne la valeur True. Ajoutez le code suivant à la méthode MoveNext.
La méthode Reset de l'interface IEnumerator ordonne à l'itérateur de pointer sur le début du fichier texte et efface la valeur d'élément actuelle. Ajoutez le code suivant à la méthode Reset.
La méthode Dispose de l'interface IEnumerator garantit que toutes les ressources non managées sont libérées avant la destruction de l'itérateur. Le descripteur de fichier utilisé par l'objet StreamReader est une ressource non managée et doit être fermé avant la destruction de l'instance de l'itérateur. Remplacez le code généré par Visual Basic pour la méthode Dispose par le code suivant.
Vous pouvez utiliser une classe énumérable dans votre code avec les structures de contrôle qui requièrent un objet implémentant IEnumerable, tel qu'une boucle For Next ou une requête LINQ. L'exemple suivant illustre StreamReaderEnumerable dans une requête LINQ.
Dim adminRequests =
From line In New StreamReaderEnumerable("..\..\log.txt")
Where line.Contains("admin.aspx 401")
Dim results = adminRequests.ToList()