Est-il possible de cloner un IEnumerable<T> exemple, l'enregistrement d'une copie de l'itération de l'état?

J'aimerais créer une copie d'un IEnumerator<T> afin que je puisse redémarrer le processus d'énumération à partir d'un endroit particulier de la collection. Clairement, il n'y a aucun avantage à faire des collections qui mettent en œuvre des IList, depuis que nous puissions nous souvenir de l'indice d'intérêt.

Est-il un moyen astucieux pour accomplir cette tâche en utilisant une combinaison de yield états et Linq fonctions? Je ne pouvais pas trouver un Clone() méthode pour copier l'agent recenseur, et voudrais éviter d'utiliser Enumerable.Skip() pour repositionner un nouvel agent recenseur souhaité la reprise point.

Aussi, j'aimerais garder les solutions aussi générique que possible, et de ne pas dépendre de l'état des collections.

Pouvez-vous donner plus de détails sur ce que vous êtes désireux de le faire avec la mise en œuvre?
C'est juste une idée que j'ai eu l'autre jour. Si c'était possible, il serait un moyen efficace de permettre à un enquêteur pour être utilisé comme un pointeur (qui ne peut être incrémenté), et pourrait permettre intelligent implémentations de recherche binaire sur la non-indexable collections.
J'y ai pensé pendant un certain temps maintenant, et de réaliser que sans l'accès aux éléments de la collection, ou un moyen de l'indice, il n'y a vraiment aucun moyen d'aller à ce sujet, à moins que la nouvelle numérisation de la collection est acceptable. En utilisant la sérialisation binaire de cloner l'itérateur est une option, mais qui ouvre une autre boîte de pandore tous ensemble.
Pensé que je devrais vous donner une mise à jour. La réelle Énumérateur de l'état de la machine peut être cloné comme je l'ai montré dans ma réponse ci-dessous. Il n'énumère pas, c'est juste des clones de l'agent recenseur.
Le problème est le typecase à IEnumerator<T>. Par exemple. List<int>.Enumerator est une struct. Normalement, vous pouvez simplement l'attribuer à préserver l'état. Si vous typecase à la IEnumerator<T> interface, il va devenir un referencetype.

OriginalL'auteur Steve Guidi | 2009-12-16