C#中的函数式编程
在函数式编程中,可以把函数看作数据。函数也可以作为参数,函数还可以返回函数。比如,LINQ就是基于函数式编程的。
两个例子引出函数式编程
语句式编程可能这样写:
string result;
if(value > )
{
result = "正数";
}
else
{
result = "负数";
}
而使用函数式表达式,可以简化为:
var result = value > "正数":"负数";
再来看一个过滤和排序的例子:
var i = ;
while(i < list.Count)
{
if(list[i] % != )
{
list.RemoveAt(i);
}
else
{
++i;
}
}
list.Sort();
函数式编程可以写成如下:
from x in list
where x % ==
orderby x
select x;
或
list
.where(x => x % == )
.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) / ;
var currentTime = new DateTime(,,).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) / ;
var currentTime = new DateTime(,,).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) / ;
var currentTime = new DateTime().AddMilliseconds(ms).ToLocalTime();
Console.WriteLine(currentTime);
}
在函数式编程中,函数返回的类型基本上另外一个函数方法的源实例。
C#中的函数式编程的更多相关文章
- 可爱的 Python : Python中的函数式编程,第三部分
英文原文:Charming Python: Functional programming in Python, Part 3,翻译:开源中国 摘要: 作者David Mertz在其文章<可爱的 ...
- Java 中的函数式编程(Functional Programming):Lambda 初识
Java 8 发布带来的一个主要特性就是对函数式编程的支持. 而 Lambda 表达式就是一个新的并且很重要的一个概念. 它提供了一个简单并且很简洁的编码方式. 首先从几个简单的 Lambda 表达式 ...
- C#中的函数式编程:序言(一)
学了那么久的函数式编程语言,一直想写一些相关的文章.经过一段时间的考虑,我决定开这个坑. 至于为什么选择C#,在我看来,编程语言分三类:一类是难以进行函数式编程的语言,这类语言包括Java6.C语言等 ...
- (数据科学学习手札48)Scala中的函数式编程
一.简介 Scala作为一门函数式编程与面向对象完美结合的语言,函数式编程部分也有其独到之处,本文就将针对Scala中关于函数式编程的一些常用基本内容进行介绍: 二.在Scala中定义函数 2.1 定 ...
- Apache Beam中的函数式编程理念
不多说,直接上干货! Apache Beam中的函数式编程理念 Apache Beam的编程范式借鉴了函数式编程的概念,从工程和实现角度向命令式妥协. 编程的领域里有三大流派:函数式.命令式.逻辑式. ...
- C#中的函数式编程:递归与纯函数(二) 学习ASP.NET Core Razor 编程系列四——Asp.Net Core Razor列表模板页面
C#中的函数式编程:递归与纯函数(二) 在序言中,我们提到函数式编程的两大特征:无副作用.函数是第一公民.现在,我们先来深入第一个特征:无副作用. 无副作用是通过引用透明(Referential ...
- C#中面向对象编程中的函数式编程详解
介绍 使用函数式编程来丰富面向对象编程的想法是陈旧的.将函数编程功能添加到面向对象的语言中会带来面向对象编程设计的好处. 一些旧的和不太老的语言,具有函数式编程和面向对象的编程: 例如,Smallta ...
- Java经典类库-Guava中的函数式编程讲解
如果我要新建一个java的项目,那么有两个类库是必备的,一个是junit,另一个是Guava.选择junit,因为我喜欢TDD,喜欢自动化测试.而是用Guava,是因为我喜欢简洁的API.Guava提 ...
- Scala 中的函数式编程基础(三)
主要来自 Scala 语言发明人 Martin Odersky 教授的 Coursera 课程 <Functional Programming Principles in Scala>. ...
随机推荐
- Linux下apache日志分析与状态查看方法
假设apache日志格式为:118.78.199.98 – - [09/Jan/2010:00:59:59 +0800] “GET /Public/Css/index.css HTTP/1.1″ 30 ...
- redis pipeline
redis pipeline 简而言之就是把多个redis命令打包,一起发送给redis server,并且一起返回结果,减少客户端和服务器之间的多次“折返跑”
- Git 常用几个操作
获取 git clone git@github.com:XXX/learning.git 更新 git pull 添加 git add XXX 上传本地 git commit -m "ap ...
- php_mysqli面向对象链接数据库(一)
<?php$servername="localhost";$username="root";$password="root";$dbn ...
- SQLSERVER拯救某个时间点被误删除的数据
SQLSERVER拯救某个时间点被误删除的数据 转载自:http://blog.csdn.net/dba_huangzj/article/details/8491327 要拯救某个时间点被误删除的数据 ...
- iOS 重大新漏洞:可绕开苹果审核机制
iOS 是目前最为安全可靠的移动平台,但既然是软件就不会是无坚不摧的.乔治亚技术信息安全中心 (Georgia Tech Information Security Center)的研究员不久前声称,他 ...
- 《Linux内核设计与实现》读书笔记(十六)- 页高速缓存和页回写
好久没有更新了... 主要内容: 缓存简介 页高速缓存 页回写 1. 缓存简介 在编程中,缓存是很常见也很有效的一种提高程序性能的机制. linux内核也不例外,为了提高I/O性能,也引入了缓存机制, ...
- Web 开发中 20 个很有用的 CSS 库
转自:http://www.oschina.net/translate/css-libraries-for-developers 在过去的几年中,CSS已经成为一大部分开发者和设计者的最爱,因为它提供 ...
- WP8:在Unity中使用OpenXLive
Unity 4.2正式版开始添加了对Windows 8.Windows Phone 8等其他平台的支持,而且开发者可以免费使用Unity引擎来开发游戏了.而作为Windows Phone和Window ...
- ArcServer JS API开发离线部署方法
1. 下载ArcGIS API for JavaScript 3.6 Library. (地址:http://support.esrichina.com.cn/uploadfile/Javascr ...