私はこれに似たコードを書いています:
public IEnumerable<T> Unfold<T>(this T seed)
{
while (true)
{
yield return [next (T)object in custom sequence];
}
}
明らかに、このメソッドは決して戻りません。(C#コンパイラはこれを黙って許可しますが、R#は「関数が戻らない」という警告を表示します。)
一般的に言って、列挙を停止する方法を提供せずに、無限の数のアイテムを返す列挙子を提供することは悪い設計ですか?
このシナリオについて特別な考慮事項はありますか?Mem?パフォーマンス?他の落とし穴?
常に終了条件を指定する場合、どのオプションがありますか?例えば:
- 包括的または排他的な境界を表すタイプTのオブジェクト
- a
Predicate<T> continue
(TakeWhile
そうです) - カウント(
Take
そうです) - ..。
Take(...)
/TakeWhile(...)
後に呼び出すユーザーに依存する必要がありますUnfold(...)
か?(既存のLinqの知識を活用しているため、おそらく推奨されるオプションです。)
コードがそのまま(一般的)またはこのパターンの特定の実装としてパブリックAPIで公開される場合、この質問に別の方法で答えますか?