C#中的函数式编程

在函数式编程中,可以把函数看作数据。函数也可以作为参数,函数还可以返回函数。比如,LINQ就是基于函数式编程的。

两个例子引出函数式编程

语句式编程可能这样写:

string result;
if(value > 0)
{
    result = "正数";
}
else
{
    result = "负数";
}

而使用函数式表达式,可以简化为:

var result = value > 0 "正数":"负数";

再来看一个过滤和排序的例子:

var i = 0;
while(i < list.Count)
{
    if(list[i] % 2 != 0)
    {
        list.RemoveAt(i);
    }
    else
    {
        ++i;
    }
}
list.Sort();

函数式编程可以写成如下:

from x in list
    where x  % 2 == 0
    orderby x
    select x;

list
    .where(x => x % 2 == 0)
    .OrderBy(x => x)

可见,在LINQ中,一个表达式(函数)的返回结果作为令一个表达式(函数)的源,还可以进行多个链式。

封装一个函数式方法

比如读取远程数据。

void Main()
{
    XDocument timeDoc;

    using(var client = new System.Net.WebClient())
    {
        timeDoc = XDocument.Parse(client.DonwloadString(""));
    }

    var ms = Convert.ToInt64(timeDoc.Root.Attribute("time").Value) / 1000;
    var currentTime = new DateTime(1977,1,1).AddMilliseconds(ms).ToLocalTime();
    Console.WriteLine(currentTime);
}

对于using部分我们可以提炼出一个方法。

private XDocument GetTime()
{

    using(var client = new System.Net.WebClient())
    {
        return XDocument.Parse(client.DonwloadString(""));
    }

}

void Main()
{
    var timeDoc = GetTime();
    var ms = Convert.ToInt64(timeDoc.Root.Attribute("time").Value) / 1000;
    var currentTime = new DateTime(1977,1,1).AddMilliseconds(ms).ToLocalTime();
    Console.WriteLine(currentTime);
}

但,还不够。以上的GetTime方法只是对WebClient这个实现了IDisposable接口的using语句进行了封装,可不可以对所有实现IDisposable接口的类型的using语句进行封装呢?

public static class MyDisposable
{
    public static TResult Using<TDisposable, TResult>(
    Func<TDisposable> factory,
    Func<TDisposable, TResult> map)
    where TDisposable : IDisposable
    {
        using(var disposable = factory())
        {
            return map(disposable);
        }
    }
}

void Main()
{
    var time = MyDisposable
        .Using(
            () => new System.Net.WebClient(),
            client => XDocument.Parse(client.DownloadString(""))
        )
        .Root
        .Attribute("time")
        .Value;

    var ms = Convert.ToInt64(time) / 1000;
    var currentTime = new DateTime().AddMilliseconds(ms).ToLocalTime();
    Console.WriteLine(currentTime);
}

在函数式编程中,函数返回的类型基本上另外一个函数方法的源实例。

时间: 2024-08-03 07:13:09

C#中的函数式编程的相关文章

Scala 中的函数式编程基础(二)

主要来自 Scala 语言发明人 Martin Odersky 教授的 Coursera 课程 <Functional Programming Principles in Scala>. 2. Higher Order Functions 把其他函数作为参数或者作为返回值,就是 higher order functions,python 里面也可以看到这样使用的情形.在酷壳上的博客有一个例子就是将函数作为返回值. 2.1 匿名函数 在 python 里边叫 lambda 函数,常常与 map(

JS函数式编程【译】4.在Javascript中实现函数式编程的技术

?? Functional Programming in Javascript 主目录上一章 建立函数式编程环境 第四章 在Javascript中实现函数式编程的技术 扶好你的帽子,我们现在要真正进入函数式的思想了. 这章我们继续下面的内容: 把所有的核心概念放到一个集中的范式里 探索函数式编程之美 一步步跟踪函数式模式相互交织的逻辑 我们将贯穿整章建立一个简单的应用做一些很酷的事情 你可能已经注意到,在上一章我们介绍Javascript的函数式库的时候引入了一些概念, 而不是在第二章<函数式编

python中的函数式编程与装饰器

2.1 python中的函数式编程 函数式编码的特点 把计算视为函数而非指令 纯函数式编程,不需要变量,没有副作用,测试简单 支持高阶函数,代码简洁 python支持的函数式编程 不是纯函数式编码:允许有变量 支持高阶函数:函数也可以作为变量传入 支持闭包:有了闭包就能返回函数 有限度地支持匿名函数 2.2 python中高阶函数 函数名可以作为变量,如 高阶函数:只能接收函数作为参数的函数 变量可以是指向函数 函数的参数可以接收变量 一个函数可以接收另一个函数作为参数 能接收函数作为参数的函数

97. 在LotusScript中模拟函数式编程

本文将介绍96. 通用字段修改器用到的在LotusScript中模拟函数式编程的技巧. 函数式编程 函数式编程是一种优美而强大的编程范式.它源于Alonzo Church提出的λ演算(Lambda演算),而某个问题能表示成Lambda演算,按照Church–Turing论题,等价于该问题在数学上是可以有效计算的.粗略地说,用对应于Lambda演算的一门函数式程序语言可以写出任何理论上可计算问题的计算程序.因为与可计算理论的紧密关系和强大的表现力,函数式编程在学术界历来很受重视.但是在日常应用的软

Javascript 中的函数式编程

本文和大家分享的主要是javascript中函数式编程相关内容,一起来看看吧,希望对大家学习javascript有所帮助. 函数式编程(functional programming)或称函数程序设计,又称泛函编程,是一种编程范型,比起命令式编程,函数式编程更加强调程序执行的结果而非执行的过程,倡导利用若干简单的执行单元让计算结果不断渐进,逐层推导复杂的运算,而不是设计一个复杂的执行过程. 函数式编程,近年来一直被炒得火热,国内外的开发者好像都在议论和提倡这种编程范式.在众多的函数式语言中,Jav

Scala 中的函数式编程基础(三)

主要来自 Scala 语言发明人 Martin Odersky 教授的 Coursera 课程 <Functional Programming Principles in Scala>. 3. Data and Abstraction 3.1 Class Hierarchies 这一集字幕不同步-,-,听得有点费力! 类的概念和其他语言里面很相似,基类,子类,父类啥的叫法差不多.在 Scala 中,所有用户自定义的类都是另外一个类的子类,如果没有显式给定父类,java 里面默认继承 java.

C#中的函数式编程:递归与纯函数(二)

在序言中,我们提到函数式编程的两大特征:无副作用.函数是第一公民.现在,我们先来深入第一个特征:无副作用. 无副作用是通过引用透明(Referential transparency)来定义的.如果一个表达式满足将它替换成它的值,而程序的行为不变,则称这个表达式是引用透明的. 现在,我们不妨进行一个尝试:我们来实现一些函数,但是这次有一个限制:只能用无副作用的表达式. 先以素数判定为例子,我们要写一个函数bool IsPrime(int n),它返回这个整数是不是素数.简单起见,我们采用最朴素的方

Python中的函数式编程

高阶函数 高阶函数就是把函数当做参数传递的一种函数.其与C#中的委托有点相似,个人认为. def add(x,y,f): return f( x)+ f( y) print add(-18,11,abs) 它将这么执行: abs(-18) + abs(11) 结果则会是: 29 map()函数 map()是 Python 内置的高阶函数,它接收一个函数 f 和一个list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回. def f(x): return x

SCALA中的函数式编程

演示了值函数,匿名函数,闭包... 其它具体的应用,还得在生产当中吧.. 这个告一段落..其它SAM,CURRY,高阶函数,集合,泛型,隐式类..这些,还是找专门的书去深入了解啦... C:\Users\hengheng>scala Welcome to Scala version 2.11.6 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_4 3). Type in expressions to have them evaluated. Type