Question

Existe-t-il des classes IEnumerable non répétables?

Par non-répétable, je veux dire lorsque vous ne pouvez pas appeler GetEnumerator plusieurs fois en toute sécurité ou lorsque l'appel de GetEnumerator a des effets secondaires observables.

Était-ce utile?

La solution

File.ReadLines() renvoie un IEnumerable<T> qui ne fonctionne qu'une fois.

Autres conseils

Il est possible pour les implémentations de IEnumerable (Of T) de renvoyer tous les éléments qu’elles jugent appropriés, pour quelque raison que ce soit. Il est fort probable que si l'on appelle deux fois GetEnumerator sur la même séquence d'éléments, puis que l'on passe en revue les deux énumérateurs, ils doivent renvoyer les mêmes éléments dans le même ordre ou renvoyer une exception. Un certain nombre de routines acceptent un IEnumerable (Of T) et échoueront si on leur en donne un qui ne respecte pas un tel contrat.

Si j’avais mes capacités, IEnumerable aurait été scindé en une famille d’interfaces; l'énumérateur de base d'IEnumerable perdrait la méthode Reset et ne donnerait aucune promesse particulière de répétabilité. Un nouvel IMultiEnumerable renverrait un énumérateur avec une méthode de réinitialisation et une garantie que plusieurs passes produiraient des données identiques. l'énumérateur pourrait également prendre en charge sa propre méthode GetEnumerator (je pense que cela devrait être pratique pour tout type prenant en charge l'énumération à passes multiples; le seul coût serait un pointeur 'start' afin que l'énumérateur imbriqué soit réinitialisé à l'emplacement de son origine. création).

Non, toute classe performante implémentant IEnumerable autorisera des énumérations répétées.

Pour énumérer des collections non répétables, vous ne disposez pas d'une classe implémentant GetEnumerator. Au lieu de cela, vous avez une méthode qui renvoie un énumérateur. Ainsi, l'énumérateur au lieu d'une classe contient la collection. Il n'est donc pas possible d'appeler Enumerable.Range deux fois pour la même collection. Pour répéter l'énumérateur, vous devez appeler la méthode pour créer une nouvelle collection.

Un exemple en est la méthode <=>. Il crée les éléments d'une plage à la volée, de sorte que la plage n'existe pas en tant que collection, ce qui la rend non répétable. Pour énumérer à nouveau la même plage, vous appelez la méthode pour créer une nouvelle plage avec les mêmes limites.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top