У меня есть следующий класс:
class CopyProvider<T> where T: IMyCloneable
{
private readonly T _original;
public CopyProvider(T original) => _original = original;
public T Current { get; private set; }
public bool MoveNext()
{
Current = _original.Clone();
return true;
}
}
Теперь мне интересно, было бы хорошей практикой объявить этот класс реализацией IEnumerator<T>
. С синтаксической точки зрения CopyProvider
соответствует требованиям, но будет ли это нарушением семантики IEnumerator
?
В качестве альтернативы я также мог бы написать следующий метод:
IEnumerable<T> ProvideCopies<T>(T original) where T: IMyCloneable
{
while(true)
yield return original.Clone();
}
Это, действительно, было бы гораздо удобнее. Но снова я сталкиваюсь с тем же вопросом: не нарушит ли такое использование IEnumerable
семантику интерфейса?
Или мне следует подумать о реализации отдельной структуры объекта с InfiniteEnumerator
и/или InfiniteEnumerable
? Однако это помешало бы мне использовать синтаксический сахар С#, такой как yield
и foreach
.
Я с нетерпением жду ваших рекомендаций.
InfiniteEnumerator
не имеет для меня никакого смысла, с чего бы ему быть бесконечным? - person Camilo Terevinto   schedule 21.10.2018IEnumerator.MoveNext()
никогда не возвращает false. Законным использованием может быть перечислитель случайных значений из Как создать перечисление случайных значений?. Вы можете сделать что-то вродеrandom.GetRandomValues().TakeWhile(i => (some condition))
. В любом случае, этот вопрос кажется мне в первую очередь мнением, или, может быть, дубликатом является ли бесконечное перечисление все еще «перечисляемым»?. - person dbc   schedule 21.10.2018