Если ваше перечисление никогда не перестанет давать результаты, было бы лучше потребовать, чтобы разработчик четко указывал, какую максимальную сумму следует генерировать, чтобы исключить риск возникновения бесконечного цикла, когда разработчик использует * 1001.* синтаксис с вашим перечислимым.например,
IEnumerable<T> ProvideCopies<T>(T original, int howMany) where T: IMyCloneable<T>
{
return Enumerable.Range(1, howMany).Select(x => original.Clone());
}
или, если вы старой школы:
IEnumerable<T> ProvideCopies<T>(T original, int howMany) where T: IMyCloneable<T>
{
for (var i = 0; i < howMany; i++)
yield return original.Clone();
}
Таким образом, разработчик не обязан потреблять все перечисление и может остановитьв любое время (т. е. вы по-прежнему получаете на ходу), но вы знаете, что в какой-то момент это прекратится, вместо того, чтобы вводить возможность постоянной блокировки вашего кода в процессе производства из-за ошибки в коде.
Если вы действительно не можете сказать, сколько копий потребуется, и вам нужно продолжать генерировать копии, пока что-то еще не скажет вам остановиться, тогда IObservable<T>
будет лучше подходить для этого сценария, так как этонамеревался "слушать" вечно до тех пор, пока вы не Dispose()
.
IObservable Interface