2016-09-01 16 views
-1

Func<IEnumerable<T>>を指定して、延期されたIEnumerable<T>を作成するビルトイン/標準方法がありますか?私のGoogleのスキルは弱いかもしれません...Func <繰返し列挙型を作成するには<T>>

IEnumerable<T>を返すいくつかの方法Fooがすぐに実行される(おそらく長時間実行されている)ことがわかっているとします。私はIEnumerable<T>に取る方法Barにそれを渡したいが、私はFooBar開始が項目を反復処理するまで、アイテムを返すために、その長時間実行プロセスを実行することにしたくない:

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; 
    } 
} 
+1

私はあなたが_really_ラッパーを自分で書きたいしなかった場合、あなたがバー 'のような何かをすることができると思います(新規のFunc > [] {()=>はFoo(項目)}、X = > x()); '。しかし、ラッパーの何が問題なのですか?解決しようとしている_特有の問題がありますか?誰かにあなたのコードを見せたいだけなら、代わりにcodereview.stackexchange.comに投稿してください(投稿要件/標準に確実に従ってください)。 –

+0

'GetItems'を再設計する権限を持っていますか?もしそうなら、私は示唆することができ、代替ソリューション –

答えて

0

あなたはLazy<T>クラスを探しているようですね。オブジェクトが最初に使用されるまでオブジェクトの作成を延期します。

これは、最初にValueプロパティにアクセスするまで、Fooメソッドの実行を延期する例です。 Fooが一度実行されると、新しいLazy<T>が作成されない限り、再度実行されません。

var items = new Lazy<IEnumerable<string>>(Foo); 
foreach(var item in items.Value) // delay starts here 
{ 
    // do work 
} 
関連する問題