.net framework 3.5 有了Linq使得对委托有了更多的支持,下面让我们来看几个有趣的示例.通常情况下,我们实现一个递归算法要写一个函数,同时还有调用的几行代码.

  现在来看使用Linq的如何实现简洁的代码,代码如下:

    1 using System;
    2 using System.Collections.Generic;
    3 using System.Linq;
    4 using System.Text;
    5 using System.IO;
    6 using NUnit.Framework;
    7
    8 namespace WindowsFormsApplication1
    9 {   10     /// <summary>
   11     /// TestRecursionWithLINQ
   12     /// </summary>
   13     /// <remark>Author : PetterLiu 2009-03-29 11:28  http://wintersun.cnblogs.com </remark>
   14     [TestFixture]
   15     public class TestRecursionWithLINQ
   16     {   17
   18         /// <summary>
   19         /// Factorials this instance.
   20         /// </summary>
   21         /// <remark>Author : PetterLiu 2009-03-29 11:28  http://wintersun.cnblogs.com </remark>
   22         [Test]
   23         public void Factorial()
   24         {   25             Func<int, int> fib = null;
   26             fib = n => (n == 1) ? 1 : fib(n - 1) * n;
   27             Console.WriteLine(fib(5));
   28         }
   29
   30         /// <summary>
   31         /// Fibonaccis this instance.
   32         /// </summary>
   33         /// <remark>Author : PetterLiu 2009-03-29 11:28  http://wintersun.cnblogs.com </remark>
   34         [Test]
   35         public void Fibonacci()
   36         {   37             Func<int, int> fib = null;
   38             fib = n => n > 1 ? fib(n - 1) + fib(n - 2) : n;
   39             Console.WriteLine(fib(6));
   40         }
   41
   42
   43         /// <summary>
   44         /// Recursions the get files.
   45         /// </summary>
   46         /// <remark>Author : PetterLiu 2009-03-29 11:27  http://wintersun.cnblogs.com </remark>
   47         [Test]
   48         public void RecursionGetFiles()
   49         {   50             var RecGetFiles =
   51                 Functional.Y<string, IEnumerable<string>>
   52                 (f => d => Directory.GetFiles(d).Concat(Directory.GetDirectories(d).SelectMany(f)));
   53
   54             foreach (var f in RecGetFiles(Directory.GetCurrentDirectory()))
   55                 Console.WriteLine(f);
   56
   57         }
   58
   59         /// <summary>
   60         /// Factorial2s this instance.
   61         /// </summary>
   62         /// <remark>Author : PetterLiu 2009-03-29 11:28  http://wintersun.cnblogs.com </remark>
   63         [Test]
   64         public void Factorial2()
   65         {   66             var dd = Functional.Y<int, int>(h => m => (m == 1) ? 1 : h(m - 1) * m);
   67             Console.WriteLine(dd(5));
   68         }
   69     }
   70
   71     /// <summary>
   72     /// Functional
   73     /// </summary>
   74     /// <remark>Author : Wes Dyer</remark>
   75     public class Functional
   76     {   77         /// <summary>
   78         ///delegate  Func<A, R>
   79         /// </summary>
   80         private delegate Func<A, R> Recursive<A, R>(Recursive<A, R> r);
   81         /// <summary>
   82         /// Ys the specified f.
   83         /// </summary>
   84         /// <typeparam name="A"></typeparam>
   85         /// <typeparam name="R"></typeparam>
   86         /// <param name="f">The f.</param>
   87         /// <returns></returns>
   88         public static Func<A, R> Y<A, R>(Func<Func<A, R>, Func<A, R>> f)
   89         {   90             Recursive<A, R> rec = r => a => f(r(r))(a);
   91             return rec(rec);
   92         }
   93     }
   94 }

Factorial是阶乘,接着是Fibonacci数列.之后把这个定义为一个名叫Funcional类,其中包含一个static方法.Factorial2使用这个类再实现阶乘,是不是简单的多.接着是RecursionGetFiles一个实际的应用,递归遍历文件夹取得文件名列表.像树型结构算法都可以用它来实现,是不是很有趣?

其中几个关键方法可以参考:
Func<(Of <(T, TResult>)>) 委托
封装一个具有一个参数并返回 TResult 参数指定的类型值的方法。
Enumerable.SelectMany<(Of <(TSource, TResult>)>) 方法 (IEnumerable<(Of <(TSource>)>), Func<(Of <(TSource, IEnumerable<(Of <(TResult>)>)>)>))
将序列的每个元素投影到 IEnumerable<(Of <(T>)>) 并将结果序列合并为一个序列。
Enumerable.Concat<(Of <(TSource>)>) 方法
连接两个序列。

Author: Petter Liu    http://wintersun.cnblogs.com

.net3.5下使用LINQ递归算法实现简洁代码相关推荐

  1. .net3.5下的Socket通信框架

    .net3.5下的Socket通信框架 1:前言 写博客时间不短了但是一直不知道怎么开头.索性就开门见山吧. 这篇文章主要给大家介绍.net3.5下的Socket通信,主要从事件池,缓冲区以及协议三个 ...

  2. clion配置_Ubuntu16.04系统下用CLion编译器调试ROS代码详细教程

    本教程主要实践如何创建一个ROS工作空间和功能包实现基于ROS的信息发送和接收,同时用CLion如何去调试这个ROS工程.ROS允许多个工作空间并存,每个工作空间中创建需要的功能包,功能包创建于工作空 ...

  3. 【原】Mac下统计任意文件夹中代码行数的工具——cloc

    这里介绍一个Mac系统统计代码行数的工具cloc. 1.首先,安装homebrew,已安装的请跳过. 打开终端工具Terminal,输入下列命令.过程中会让你按RETURN键以及输入mac桌面密码,按 ...

  4. linux切换图片的代码,cacaview – Linux终端下将图片转换ASCII Art代码图案

    有时你可能需要终端输出许多图片,那么现在就让我们在Linux终端打开一个新窗口显示图片. cacaview – Linux终端下将图片转换ASCII Art代码图案的命令. Ubuntu下安装命令: ...

  5. php发送邮件smtp源码,php下使用SMTP发邮件的代码

    首页 > 网络编程 > PHP编程 > php技巧 > php下使用SMTP发邮件的代码 php下使用SMTP发邮件的代码 2008-01-10 20:37:22 作者: ph ...

  6. eclipse下使用git插件上传代码至github

    eclipse下使用git插件上传代码至github 1.eclipse下安装git 正常情况下,eclipse 是自带 git 插件的,那么即可跳至步骤1的最后一小步,配置 git . 如果十分悲剧 ...

  7. 手把手教你如下在Linux下如何写一个C语言代码,编译并运行

    文章目录 手把手教你如下在Linux下如何写一个C语言代码,编译并运行 打开Ubuntu终端 创建 helloworld.c 编译C文件 手把手教你如下在Linux下如何写一个C语言代码,编译并运行 ...

  8. linux进度条脚本,Linux下简易进度条的实现代码

    在生活中,进度条是很常见的,那么,进度条是如何实现的呢? 首先,进度条的动态是利用人眼视觉暂留效果的.实际上是如下过程: 先输出:[=     ]表示进度是1%,刷新之后 再输出:[==    ].. ...

  9. asc码转换 linux_Linux终端下将图片转换ASCII Art代码图案

    有时你可能需要终端输出许多图片,那么现在就让我们在Linux终端打开一个新窗口显示图片. cacaview - Linux终端下将图片转换ASCII Art代码图案的命令. Ubuntu下安装命令: ...

最新文章

  1. Linux技术研究-基础篇(raid与LVM,配额)
  2. Ubuntu安装步骤
  3. Java状态和策略设计模式之间的差异
  4. JDBC通过连接池链接数据库总是失败的解决办法
  5. 兰州市中考会考计算机考试,2016兰州中考体育26日开考 采用全套智能测试仪器...
  6. SfM(Structure from motion,运动恢复结构,从motion中实现3D重建。也就是从时间系列的2D图像中推算3D信息
  7. 计算机联锁架的构成,TYJL-II计算机联锁的特点
  8. java mina框架实例_MINA框架简介和一个简单的例子
  9. PLSQL 官方下载及安装
  10. 什么是PMI指数?PMI指数是什么意思? 如何计算PMI指数?
  11. oracle的shell命令,shell脚本执行oracle insert语句seraph
  12. 远程启动IDEA时报错Startup Error: Unable to detect graphics environment
  13. 出生日期与年龄python_python根据出生日期返回年龄的方法
  14. win7虚拟机iso文件
  15. sql超键 候选键 主键
  16. flashback table 闪回表到指定时间或SCN
  17. python读音有道-Python 20行简单实现有道在线翻译的详解
  18. luoguP3518 [POI2011]SEJ-Strongbox
  19. 哈哈日语 日语五十音图记忆和发音方法
  20. 华硕FN键补充应用下载-可以在windows的应用商店寻找进行下载,安装。-asus-keyboard Hotkeys

热门文章

  1. 完美世界手游不显示新服务器,完美世界手游手Q互通-黑曜开服时间表_完美世界手游新区开服预告_第一手游网手游开服表...
  2. 【企业管理】人力资源-华为实践
  3. mybatis insert获取主键
  4. java 根据当前时间获得一周日期
  5. Vue中使用Openlayers加载Geoserver发布的TileWMS时单击获取shp文件的坐标信息
  6. Could not find a version that satisfies the requirement PIL
  7. Java中实现获取数组中最大值
  8. 怎样查看mysql的安装路径
  9. spring系列-注解驱动原理及源码-属性赋值
  10. Windoes下安装配置flutter环境