zoukankan      html  css  js  c++  java
  • 在Lambda表达式中进行递归调用

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

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

    示例代码:

        class Test
        
    {
            
    /// <summary>
            
    /// 
            
    /// </summary>
            
    /// <param name="v1"></param>
            
    /// <param name="v2"></param>
            
    /// <param name="num"></param>
            
    /// <param name="total"></param>
            
    /// <returns></returns>

            public delegate long AddMethod(long v1, long v2, int num, int cout);

            
    /// <summary>
            
    /// 
            
    /// </summary>
            
    /// <param name="addMethod"></param>
            
    /// <param name="cout"></param>

            static void Print(AddMethod method, int cout)
            
    {
                Console.WriteLine(method(
    01, 2, cout));
            }


            
    static void Main()
            
    {
                
    //求0,1,1,2,3,5,8.类似的数据队列在第30个位置的数
                Print((v1, v2, num, cout) =>
                    
    {
                        Console.Write(v1);
                        Console.Write(
    ",");

                        num
    ++;
                        
    if (num == cout)
                        
    {
                            Console.Write(v2);   
                            Console.WriteLine();
                            
    return v1 + v2;
                        }

                        
    else
                        
    {                        
                            
    //取得当前方法
                            StackFrame frame = new StackFrame(0);
                            
    //递归调用
                            return (long)(frame.GetMethod().Invoke(num, new object[] { v2, (v1 + v2), num, cout }));
                        }

                    }
    30);
                Console.Read();
            }

        }

    我们的代码成功运行了,成功的求出在第30个位置的数值是:514229

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

    执行后的结果都是一样的(不一样才怪了Orz)
  • 相关阅读:
    看着四年前的代码,那时奋斗的模样,百感滋味
    操作系统中进程调度策略有哪几种?
    Linux操作系统及调用接口
    wpf 图像浏览(平移,缩放)
    C# double小数点的取舍
    C# 读写16位tif图片灰度数据
    WPF Slider滑块的使用
    WPF使用MVVMLight的ViewModel 访问控件的属性方法事件以及多页面传递信息
    苹果手机小米手环5收不到微信QQ消息提醒的解决办法
    AD覆铜设置规则
  • 原文地址:https://www.cnblogs.com/kingthy/p/1162248.html
Copyright © 2011-2022 走看看