2013-05-03 68 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