Я пишу код, который выглядит примерно так:
public IEnumerable<T> Unfold<T>(this T seed)
{
while (true)
{
yield return [next (T)object in custom sequence];
}
}
Очевидно, этот метод никогда не вернется. (Компилятор C # позволяет это молча, а R # выдает предупреждение «Функция никогда не возвращается» .)
Вообще говоря, является ли плохой дизайн, предусматривающий перечислитель, который возвращает бесконечное число элементов, не предоставляя способ прекратить перечисление?
Есть ли какие-то особые соображения для этого сценария? Mem? Perf? Другие ошибки?
Если мы всегда предоставляем условие выхода, каковы варианты? Например:
- объект типа T, представляющий включающую или исключающую границу
- a
Predicate<T> continue
(как и TakeWhile
)
- количество (как
Take
)
- ...
Должны ли мы полагаться на пользователей, звонящих Take(...)
/ TakeWhile(...)
после Unfold(...)
? (Возможно, предпочтительный вариант, поскольку он использует существующие знания Linq.)
Не могли бы вы ответить на этот вопрос по-другому, если бы код собирался опубликовать в общедоступном API, либо как есть (универсальный), либо как конкретную реализацию этого шаблона?