原文发布时间为:2011-04-24 —— 来源于本人的百度文章 [由搬家工具导入]

http://www.cnblogs.com/wintersun/archive/2009/03/29/1424352.html 

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

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Test
{
    public class Recursion
    {

        private delegate Func<A, R> Recursive<A, R>(Recursive<A, R> r);

        public static Func<A, R> Y<A, R>(Func<Func<A, R>, Func<A, R>> f)
        {

            Recursive<A, R> rec = r => a => f(r(r))(a);

            return rec(rec);

        }

    }

 
   
    class Program
    {
        static void Main(string[] args)
        {
        }

        public void Factorial2()
        {
            var dd = Recursion.Y<int, int>(h => m => (m == 1) ? 1 : h(m - 1) * m);
            Console.WriteLine(dd(5));

        }

 public void RecursionGetFiles()
        {
            var RecGetFiles =
                Recursion.Y<string, IEnumerable<string>>
                (f => d =>Directory.GetFiles(d).Concat(Directory.GetDirectories(d).SelectMany(f)));

            foreach (var f in RecGetFiles(Directory.GetCurrentDirectory()))
                Console.WriteLine(f);
        }

    }
}

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

最新文章

  1. SVN搭建简单教程
  2. JSON的一点:
  3. ELK日志管理之——elasticsearch部署
  4. [codeforces 241]A. Old Peykan
  5. Web自动化框架LazyUI使用手册(2)--先跑起来再说(第一个测试用例-百度搜索)
  6. [PHP] htaccess 探秘
  7. node笔记——gulp-imagemin图片压缩
  8. node.js 入门教程(beginnder guide
  9. 计算4000000000内的最大f(n)=n值---字符串的问题python实现(五岁以下儿童)
  10. 集美大学网络1413第十一次作业成绩(团队七) -- Alpha冲刺之事后诸葛亮
  11. spring mvc 整合Quartz
  12. RHEL 6 mdadm 实现Soft Raid
  13. 第七节: EF的三种事务的应用场景和各自注意的问题(SaveChanges、DBContextTransaction、TransactionScope)
  14. 【原创】大数据基础之Zookeeper(4)应用场景
  15. 【转】javaUDP套接字通信
  16. 列式数据库~clickhouse 副本集架构的搭建
  17. Big Number-Asia 2002, Dhaka (Bengal) (计算位数)题解
  18. epoll对poll(select)的改进
  19. intellJ IDE 15 生成 serialVersionUID
  20. 使用SQL Server连接xml接口,读取并解析数据

热门文章

  1. springboot中加入druid对sql进行监控
  2. 科学计算库Numpy——数组形状
  3. 解决cmd目录下pip命令不存在的问题
  4. 3 View - Request对象
  5. Java多线程-join方法
  6. vrpie在Visio Studio 中无法调试的问题
  7. IOS开发---菜鸟学习之路--(二十一)-利用正则表达式解析URL获取其中的参数
  8. 【Best Time to Buy and Sell Stock II】cpp
  9. 如何将Linux rm命令删除的文件放入垃圾箱
  10. [19/02/23]ToolsShare 工具分享 VPNTethering Android (Root Required)