如何從自己調用Func
函數?調用自己的函數變量
例如:
Func<int, int> f = x => {
// do stuff
if (x > 5) { return f(x); }
// do other stuff
};
如何從自己調用Func
函數?調用自己的函數變量
例如:
Func<int, int> f = x => {
// do stuff
if (x > 5) { return f(x); }
// do other stuff
};
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
聰明,以一種醜陋的方式。我不知道是喜歡它還是討厭它。雖然,很高興看到替代品。 – 2013-05-04 00:01:33
簡單的方法是創建變量,其分配null
,並然後用它在你的拉姆達:
Func<int, int> f = null;
f = x => {
// do stuff
if (x > 5) { return f(x); }
// do other stuff
};
通過它來的時候實際上調用f
中的委託,它將被分配給一個非空值。
如果你願意,你也可以按照這個(理論重)blog entry所示的方法。
+1。鏈接到另一個Y定點組合器文章http://blogs.msdn.com/b/wesdyer/archive/2007/02/02/anonymous-recursion-in-c.aspx – 2013-05-03 23:52:59
像這樣的事情http://stackoverflow.com/a/16361037/1906557? – I4V 2013-05-03 23:21:49
你可以修改函數來不需要遞歸。 – 2013-05-04 00:03:36