2013-05-03 102 views
1

如何從自己調用Func函數?調用自己的函數變量

例如:

Func<int, int> f = x => { 
     // do stuff 
     if (x > 5) { return f(x); } 
     // do other stuff 
}; 
+0

像這樣的事情http://stackoverflow.com/a/16361037/1906557? – I4V 2013-05-03 23:21:49

+0

你可以修改函數來不需要遞歸。 – 2013-05-04 00:03:36

回答

1

dlev的答案是相當簡單的,但你也可以做到這一點的方法:

首先聲明,接受自己作爲一個參數的委託類型:

public delegate TResult RecursiveFunc<TParam, TResult>(
    TParam param1, 
    RecursiveFunc<TParam, TResult> func); 

註釋:當然,代表不一定是通用的。

現在可以創建你的lambda表達式是這樣的:

RecursiveFunc<int, int> f = (x, g) => { 
    // do stuff 
    if (x > 5) { return g(x, g); } 
    // do other stuff 
}; 

f(123, f); // Invoke recursively 
+1

聰明,以一種醜陋的方式。我不知道是喜歡它還是討厭它。雖然,很高興看到替代品。 – 2013-05-04 00:01:33

6

簡單的方法是創建變量,其分配null,並然後用它在你的拉姆達:

Func<int, int> f = null; 
f = x => { 
    // do stuff 
    if (x > 5) { return f(x); } 
    // do other stuff 
}; 

通過它來的時候實際上調用f中的委託,它將被分配給一個非空值。

如果你願意,你也可以按照這個(理論重)blog entry所示的方法。

+0

+1。鏈接到另一個Y定點組合器文章http://blogs.msdn.com/b/wesdyer/archive/2007/02/02/anonymous-recursion-in-c.aspx – 2013-05-03 23:52:59