在Lambda表达式中进行递归调用

摘要:
Lambda表达式是一种匿名方法。在开发过程中我们不知道它的方法名,所以我们如何递归地调用它?如果你读了我的文章“让你知道你的方法是由谁调用的”,你应该“啊哈”拍你的头,想法就会出来,对吧!!即,直接使用StackFrame获取当前执行的方法,然后直接调用。

Lambda表达式是一个匿名的方法,在开发期我们是不知道其方法名是什么的,所以我们要怎么递归调用呢?

如果你看过我这文章让您知道您的方法是被何“人”调用 》的话,你应该会“啊哈”的拍一下头脑,思路就出来了,没错!!就是直接用StackFrame获取当前执行的方法,然后直接Invoke即可。

示例代码:

在Lambda表达式中进行递归调用第1张    class Test
在Lambda表达式中进行递归调用第2张在Lambda表达式中进行递归调用第3张    
在Lambda表达式中进行递归调用第4张{
在Lambda表达式中进行递归调用第5张在Lambda表达式中进行递归调用第6张        
/**//// <summary>
在Lambda表达式中进行递归调用第7张        
/// 
在Lambda表达式中进行递归调用第7张        
/// </summary>
在Lambda表达式中进行递归调用第7张        
/// <param name="v1"></param>
在Lambda表达式中进行递归调用第7张        
/// <param name="v2"></param>
在Lambda表达式中进行递归调用第7张        
/// <param name="num"></param>
在Lambda表达式中进行递归调用第7张        
/// <param name="total"></param>
在Lambda表达式中进行递归调用第13张        
/// <returns></returns>

在Lambda表达式中进行递归调用第7张        public delegate long AddMethod(long v1, long v2, int num, int cout);
在Lambda表达式中进行递归调用第7张
在Lambda表达式中进行递归调用第5张在Lambda表达式中进行递归调用第6张        
/**//// <summary>
在Lambda表达式中进行递归调用第7张        
/// 
在Lambda表达式中进行递归调用第7张        
/// </summary>
在Lambda表达式中进行递归调用第7张        
/// <param name="addMethod"></param>
在Lambda表达式中进行递归调用第13张        
/// <param name="cout"></param>

在Lambda表达式中进行递归调用第7张        static void Print(AddMethod method, int cout)
在Lambda表达式中进行递归调用第5张在Lambda表达式中进行递归调用第6张        
在Lambda表达式中进行递归调用第4张{
在Lambda表达式中进行递归调用第7张            Console.WriteLine(method(
01, 2, cout));
在Lambda表达式中进行递归调用第13张        }

在Lambda表达式中进行递归调用第7张
在Lambda表达式中进行递归调用第7张        
static void Main()
在Lambda表达式中进行递归调用第5张在Lambda表达式中进行递归调用第6张        
在Lambda表达式中进行递归调用第4张{
在Lambda表达式中进行递归调用第7张            
//求0,1,1,2,3,5,8在Lambda表达式中进行递归调用第4张.类似的数据队列在第30个位置的数
在Lambda表达式中进行递归调用第7张
            Print((v1, v2, num, cout) =>
在Lambda表达式中进行递归调用第5张在Lambda表达式中进行递归调用第6张                
在Lambda表达式中进行递归调用第4张{
在Lambda表达式中进行递归调用第7张                    Console.Write(v1);
在Lambda表达式中进行递归调用第7张                    Console.Write(
",");
在Lambda表达式中进行递归调用第7张
在Lambda表达式中进行递归调用第7张                    num
++;
在Lambda表达式中进行递归调用第7张                    
if (num == cout)
在Lambda表达式中进行递归调用第5张在Lambda表达式中进行递归调用第6张                    
在Lambda表达式中进行递归调用第4张{
在Lambda表达式中进行递归调用第7张                        Console.Write(v2);   
在Lambda表达式中进行递归调用第7张                        Console.WriteLine();
在Lambda表达式中进行递归调用第7张                        
return v1 + v2;
在Lambda表达式中进行递归调用第13张                    }

在Lambda表达式中进行递归调用第7张                    
else
在Lambda表达式中进行递归调用第5张在Lambda表达式中进行递归调用第6张                    
在Lambda表达式中进行递归调用第4张{                        
在Lambda表达式中进行递归调用第7张                        
//取得当前方法
在Lambda表达式中进行递归调用第7张
                        StackFrame frame = new StackFrame(0);
在Lambda表达式中进行递归调用第7张                        
//递归调用
在Lambda表达式中进行递归调用第5张在Lambda表达式中进行递归调用第6张
                        return (long)(frame.GetMethod().Invoke(num, new object[] 在Lambda表达式中进行递归调用第4张{ v2, (v1 + v2), num, cout }));
在Lambda表达式中进行递归调用第13张                    }

在Lambda表达式中进行递归调用第13张                }
30);
在Lambda表达式中进行递归调用第7张            Console.Read();
在Lambda表达式中进行递归调用第13张        }

在Lambda表达式中进行递归调用第65张    }

我们的代码成功运行了在Lambda表达式中进行递归调用第66张,成功的求出在第30个位置的数值是:514229

其时,.NET里还有一个东东可以方便的得到当前调用方法的引用,这东东就是MethodBase,其有一个静态方法GetCurrentMethod 可直接获取当前执行的方法引用,所以我们可以将上面的StackFrame处的两句代码改为如下:
在Lambda表达式中进行递归调用第1张                        //递归调用
在Lambda表达式中进行递归调用第2张在Lambda表达式中进行递归调用第3张
                        return (long)(MethodBase.GetCurrentMethod().Invoke(num, new object[] 在Lambda表达式中进行递归调用第4张{ v2, (v1 + v2), num, cout }));

执行后的结果都是一样的在Lambda表达式中进行递归调用第71张(不一样才怪了Orz)

免责声明:文章转载自《在Lambda表达式中进行递归调用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇使用动态SQL处理table_name作为输入参数的存储过程(MySQL)升级IDEA后Lombok不能用了,如何解决?下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Python 基础入门 10_3 进程线程和协程

"""线程一共有5个状态:创建,就绪/可运行状态,运行,阻塞/等待,完成/死亡当线程创建出来后,就进入了可运行状态,等线程启动后,便到了运行阶段,运行完后,便会完成销毁或者运行的过程中异常导致中途退出Semaphore()和Barrier()的实现:上述代码我们同时创建了5个线程并启动,这5个线程执行函数时,遇到了Semaphore或Barrier的函数,...

L3-002 特殊堆栈 (30分) vector容器的模拟、vector容器的一些用法

vector容器的简单应用,我们可以用vector维护一个有序数组,每次对要插入的数用upper_bound或者lower_bound来 为这个数找一个应该插入到vector的位置。另外再找一个数组来维护插入数的顺序,来面对pop操作 在从小到大的排序数组中, lower_bound( begin,end,num):从数组的begin位置到end-1位置...

服务器性能自动化测试脚本

1.自动化测试脚本unixbench yum install -y wgetwget --no-check-certificate https://github.com/teddysun/across/raw/master/unixbench.shchmod +x unixbench.sh./unixbench.sh 115.231.102.80: Dou...

微信小程序添加、删除class’

终于等到公司开发小程序了,学习的时候不觉得有什么,实际开发就会出现各种问题。 今天第一天开发就遇到问题了。 项目需求,要一个平时的nav导航栏,这玩意用jQuery两行代码解决了,可是小程序不允许操作dom啊; 折腾一个多小时最终找到两种方法,分享给大家; 第一种比较直接但是,不适合多个操作; 1,第一种感觉比较傻      <view class=...

java生成解析xml的另外两种方法JAXB

   JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示...

算法思想篇(1)————枚举算法

枚举算法的思想是:将问题的所有可能的答案一一列举,然后根据条件判断此答案是否合适,保留合适的,丢弃不合适的。在C语言中,枚举算法一般使用while循环实现。使用枚举算法解题的基本思路如下所示。 (1)确定枚举对象、枚举范围和判定条件; (2)逐一枚举可能的解,验证每个解是否是问题的解。 枚举算法一般按照如下三个步骤进行。 (1)题解的可能范围,不能...