yield return
キーワードをかなり使用していますが、IEnumerable
に範囲を追加したいときに不足していることがわかりました。これが私がやりたいことの簡単な例です:
IEnumerable<string> SomeRecursiveMethod()
{
// some code
// ...
yield return SomeRecursiveMethod();
}
当然、これによりエラーが発生します。これは、単純なループを実行することで解決できます。これを行うためのより良い方法はありますか?ループは少し不格好に感じます。
いいえ、恐れることはありません。 F#doesはyield!
でこれをサポートしますが、C#には同等のものはありません-基本的にループを使用する必要があります。すみません...あなたの痛みを感じます。 私のEdulinqブログ投稿の1つ で言及しましたが、ここでは物事が簡単になります。
利回りリターンを再帰的に使用するとコストがかかる可能性があることに注意してください-詳細については Wes Dyerのイテレータに関する投稿 を参照してください(4年前に検討されていた「yieldforeach」について言及しています...)
ループオーバーするIEnumerable
がすでにあり、戻り値の型がIEnumerable
の場合(yield return
を使用できる関数の場合のように)、単にその列挙を返すことができます。
複数のIEnumerable
sの結果を組み合わせる必要がある場合は、IEnumerable<T>.Concat
拡張メソッドを使用できます。
ただし、再帰的な例では、列挙の内容に基づいて列挙/連結を終了する必要があります。私の方法はこれをサポートするとは思わない。
Yieldキーワードは確かにとてもいいです。ただし、forループにネストすると、より多くのグルーコードが生成および実行されます。
機能性の低いプログラミングスタイルで生活できる場合は、追加するリストを渡すことができます。
void GenerateList(List<string> result)
{
result.Add("something")
// more code.
GenerateList(result);
}