Вот один из подходов, использующий static class
:
public static class TransformEnumerator2<TSource, TTarget>
{
public static IEnumerator<TTarget> GetEnumerator(IEnumerator<TSource> source, Func<TSource, TTarget> transformFunc)
{
return (IEnumerator<TTarget>)GetEnumerable(source, transformFunc);
}
private static IEnumerable<TTarget> GetEnumerable(IEnumerator<TSource> source, Func<TSource, TTarget> transformFunc)
{
while (source.MoveNext())
yield return transformFunc(source.Current);
}
}
Обратите внимание, что метод GetEnumerable
является закрытым. В общедоступном API клиент ожидает, что он сможет использовать перечисляемое множество раз, но перечисляемое здесь может использоваться только один раз. Однако ожидается, что Enumerator будет использоваться только один раз, поскольку поведение Reset не определено, поэтому это достигает своей цели.