Func<IEnumerable<T>>
を指定して、延期されたIEnumerable<T>
を作成するビルトイン/標準方法がありますか?私のGoogleのスキルは弱いかもしれません...Func <繰返し列挙型を作成するには<T>>
IEnumerable<T>
を返すいくつかの方法Foo
がすぐに実行される(おそらく長時間実行されている)ことがわかっているとします。私はIEnumerable<T>
に取る方法Bar
にそれを渡したいが、私はFoo
がBar
開始が項目を反復処理するまで、アイテムを返すために、その長時間実行プロセスを実行することにしたくない:
IEnumerable<string> Foo()
{
var items = GetItems(); // long running process
return items;
}
void Bar(IEnumerable<string> foo)
{
/* something else long-running, or return immediately if some pre-condition fails and we don't even want to iterate over foo */
foreach (var item in foo)
{
// do something
}
}
void Run()
{
IEnumerable<string> foo = GetFooWrapper(Foo)
Bar(items);
}
IEnumerable<string> GetFooWrapper(Func<IEnumerable<string>> foo)
{
// ???
}
最良の方法は何GetFooWrapper
を実装していますか?私の最も簡単なアプローチは次のとおりですが、それを行うための「より良い」方法がある場合は、そのことを知りたいと思います。それは重要ではないが、R#はそれをreturn foo();
に単純化することを示唆している。
IEnumerable<string> GetFooWrapper(Func<IEnumerable<string>> foo)
{
foreach (var item in foo())
{
yield return item;
}
}
私はあなたが_really_ラッパーを自分で書きたいしなかった場合、あなたがバー 'のような何かをすることができると思います(新規のFunc> [] {()=>はFoo(項目)}、X = > x()); '。しかし、ラッパーの何が問題なのですか?解決しようとしている_特有の問題がありますか?誰かにあなたのコードを見せたいだけなら、代わりにcodereview.stackexchange.comに投稿してください(投稿要件/標準に確実に従ってください)。 –
'GetItems'を再設計する権限を持っていますか?もしそうなら、私は示唆することができ、代替ソリューション –