zoukankan      html  css  js  c++  java
  • 编写递归调用的Lambda表达式

    前段时间,我写一个树的访问算法的时候,用了Visitor模式把访问的算法分离了出来,当时打算用lambda表达式写visit算法的,却发现带递归调用的lambda表达式没想象的那么好写,憋了半天愣是没写出来,由于当时赶进度,就写成了普通的函数了。

    今天晚上研究了一下递归调用的Lambda表达式的写法,发现也还是比较简单的,就是脑袋要转个弯(可能当时这个弯没有转过来),首先给一个简单的示例:

        int i = 1;

        RecursiveRun(self =>

            {

                Console.WriteLine("hello world " + i++);

                self();

            });

     

        static void RecursiveRun(Action<Action> action)

        {

            action(() => RecursiveRun(action));

        }

    可能有人说函数RecursiveRun是无参数的,基本上没什么用,下面这个就是带一个参数的版本了(如果需要更多的参数的版本,直接把RecursiveRun函数稍稍修改即可):

        static void RecursiveRun<T>(T obj, Action<T, Action<T>> action)

        {

            action(obj, o => RecursiveRun(o, action));

        }

    通过这个函数,就可以把二叉树的遍历算法用lambda表达式给表示出来了:

        class BinTree

        {

            public int Value { get; set; }

            public BinTree Left { get; set; }

            public BinTree Right { get; set; }

     

            public BinTree(int value)

            {

                this.Value = value;

            }

     

            public void Accept(Action<BinTree> visitor)

            {

                visitor(this);

            }

     

            public void Accept(Action<BinTree, Action<BinTree>> visitor)

            {

                visitor(this, node => node.Accept(visitor));

            }

     

            public override string ToString()

            {

                return Value.ToString();

            }

        }

     

        var nodes = Enumerable.Range(0, 5).Select(i => new BinTree(i)).ToArray();

     

        nodes[0].Left = nodes[1];

        nodes[0].Right = nodes[2];

        nodes[1].Left = nodes[3];

        nodes[1].Right = nodes[4];

     

        nodes[0].Accept((node, visitor) =>

            {

                Console.WriteLine(node.Value);

                if (node.Left != null)

                    visitor(node.Left);

                if (node.Right != null)

                    visitor(node.Right);

            });

     

  • 相关阅读:
    C#(99):TreadPool
    C#(99):多线程锁:Mutex互斥体,Semaphore信号量,Monitor监视器,lock,原子操作InterLocked
    C#(99):Thead线程 System.Thread
    ASP.NET(99):WebService之WebMethod参数介绍
    C#(99):WCF之WebService
    Windows服务 System.ServiceProcess.ServiceBase类
    应用程序域 System.AppDomain,动态加载程序集
    C#(99):app.config/web.config配置文件增删改
    C#(99):文件读写(三)利用FileStream类操作字节数组byte[]、BinaryFormatter、内存流MemoryStream
    C#(99):文件读写(二)利用SteamReader和StreamWrite类处理字符串、FileSystemWatcher、BinaryReader/BinaryWriter
  • 原文地址:https://www.cnblogs.com/TianFang/p/2153793.html
Copyright © 2011-2022 走看看