Func<T, TResult> 委托的由来和调用和好处(为了高大上,为了白富美)
Func<T, TResult>是系统的内置委托的中最常用的一个。特点就是必须有一个返回值。(func委托有多个重载,所有重载的最后一个参数就是返回值的类型,前面的是参数类型)。注:没有返回值的系统内置委托是Action<T>
Func委托的作用就是当我们需要传入n参数并有返回值时,我们不用再去定义一个委托,直接调用func即可。
例如: 当我们输入一个字符串,然后把这个字符串转换为大写并返回。
我们最原始的做法是:先写一个方法
public string toUpperStr(string SourceStr)
{
return SourceStr.ToUpper();
}
然后调用
public ActionResult Index()
{
string sourceStr = "SuGuoTong";
ViewBag.Result = ToUpperStr(sourceStr);
return View();
}
但如果还需要把字符串改成小写,还得在增加一个方法,为了方便,所以我们引进委托。
更重要的是上面的代码一看就是屌丝代码,为了高大上,为了白富美,我们在行动。
delegate string ConvertMethod(string str);//传入一个参数和返回一个返回值的委托
public ActionResult Index()
{
string sourceStr = "SuGuoTong";
ConvertMethod convert = ToUpperStr;
ViewBag.Result = convert(sourceStr);
return View();
}
public string ToUpperStr(string SourceStr)
{
return SourceStr.ToUpper();
}
把上面我们自己声明的委托改为系统内置的委托Func<T, TResult>
public ActionResult Index()
{
string sourceStr = "SuGuoTong";
Func<string, string> convert = ToUpperStr; //Func<string,string>第一个string是参数类型,第二个string是返回值类型
ViewBag.Result = convert(sourceStr);
return View();
}
public string ToUpperStr(string SourceStr)
{
return SourceStr.ToUpper();
}
//变白了,想不想变富
为了变富,我们把下面的方法也去掉,这时候就要用到匿名方法
public ActionResult Index()
{
string sourceStr = "SuGuoTong";
Func<string, string> convert = delegate(string s) { return s.ToUpper(); };
ViewBag.Result = convert(sourceStr);
return View();
}
//是不是又白又富了,想不想变美
为了变美,我们引进lambda(亚麻带)表达式
public ActionResult Index()
{
string sourceStr = "SuGuoTong";
Func<string, string> convert = o=>o.ToUpper();
ViewBag.Result = convert(sourceStr);
return View();
}
//成了白富美,就可以进军岛国了
完!
调用系统方法需传入func的例子:
string[] strAry = { "gs","gsd","htrh"};
var resl = strAry.Select<string, string>(o => o.ToUpper());
附:匿名方法
关于调用系统的方法,我们需要传匿名方法的例子很多:
比如Array.ConvertAll方法把一个string[]转换成int[]
这就是需要我们传一个匿名方法(传入一个string类型参数,返回一个int类型的匿名方法)
intArr = Array.ConvertAll<string, int>(str, delegate(string s) { return int.Parse(s) * ; });
或直接用lambda代替
intArr = Array.ConvertAll<string, int>(str, o => int.Parse(o) * 5);
Func<T, TResult> 委托的由来和调用和好处(为了高大上,为了白富美)的更多相关文章
- 参考例子,学习Func<T, TResult>委托
这些天,开发ASP.NET MVC,其间有查找资料,发现一个全新的Func<T, TResult> 委托.让我们在开发时,节省与简化很多. 在开发过程中,我们需要把一个泛型List< ...
- Func<T, TResult> 委托
Func<T, TResult> 委托 Visual Studio 2008 命名空间: System程序集: System.Core(在 System.Core.dll 中) 语 ...
- func 和action 委托的使用
func 可以带返回值,action 不带返回值 平时我们如果要用到委托一般都是先声明一个委托类型,比如: private delegate string Say(); string说明适用于这个委 ...
- Expression<Func<T,TResult>>和Func<T,TResult>
1.Expression<Func<T,TResult>>是表达式 //使用LambdaExpression构建表达式树 Expression<Func<int, ...
- Func<T,TResult>泛型委托
描述: 封装一个具有一个参数并返回TResult参数指定的类型值的方法. 语法: public delegate TResult Func<T,TResult>(T arg); 参数类型: ...
- C# 笔记 Func<TResult> 委托、Action<T> 委托
https://blog.csdn.net/wanglui1990/article/details/79303894 Func<ΤResult> 委托:代理(delegate)一个返回类型 ...
- 使用Func<T1, T2, TResult> 委托返回匿名对象
Func<T1, T2, TResult> 委托 封装一个具有两个参数并返回 TResult 参数指定的类型值的方法. 语法 public delegate TResult Func< ...
- Func<T,TResult>的使用方法(转载)
public delegate TResult Func <T, TResult>(T arg) 这是一个委托方法,这个方法有一个参数T(T arg),比如int arg,string a ...
- Func 和 Action 委托
有了泛型委托,就有了一能适用于任何返回类型和任意参数(类型和合理的个数)的通用委托,Func 和 Action.如下所示(下面的in表示参数,out表示返回结果): delegate TResult ...
随机推荐
- Spark源码分析环境搭建
原创文章,转载请注明: 转载自http://www.cnblogs.com/tovin/p/3868718.html 本文主要分享一下如何构建Spark源码分析环境.以前主要使用eclipse来阅读源 ...
- Ubuntu--服务器版本系统安装图解教程
附Ubuntu Server 13.04系统镜像下载地址: 32位:http://mirrors.163.com/ubuntu-releases/13.04/ubuntu-13.04-server-i ...
- android-exploitme(五):不安全的数据存储
今天我来看看如果android将数据存储在sdcard,它的权限是什么样的 1. 打开emm软件,做一笔转账.
- nodejs 操作mysql
这篇文章主要介绍了nodejs中操作mysql数据库示例,本文演示了如何在NodeJS中创建创建mysql连接.mysql数据库.插入数据.查询数据等功能,需要的朋友可以参考下 引言: 继前面的No ...
- sublime3配置Quick-X+自动错误提示
sublime3配置 安装Package Control 配置Quick-x API提示 配置Lua自动语法错误提示 sublime3 安装 Package Control View->Show ...
- 【USACO】【section1.1】Your Ride Is Here
以前的账号忘记了,只能从头了. 入门题不解释,就是sumg和sumc初始值置1不能置0.开始享用一个循环计算出sumg和sumc,其实两个数组最大程度为6,节省不了什么时间. /*ID:Moment1 ...
- 同一Session中的aspx页面的并发限制
项目中客户端采用WebBrowser展示aspx页面,用户有可能打开带多个带WebBrowser的winform窗体.此时,如果其中一个的WebBrowser的aspx页面响应较长的话,其他窗体中的W ...
- win8.1下解决Visual C++不兼容的方法
1.下载visual c++的安装包 百度云下载地址为:http://pan.baidu.com/s/1c0dRAYs 2.修改MSDEV.EXE文件名 安装完成后在安装目录下找到MSDEV.EXE, ...
- 在LINUX上创建GIT服务器【转】
转自:http://blog.csdn.net/xiongmc/article/details/9176785 如果使用git的人数较少,可以使用下面的步骤快速部署一个git服务器环境. 1. Cli ...
- Google 网络库Volley简介
Volley是什么? 2013 Google I/O 大会发布的Android平台网络通讯库,旨在帮助开发者实现更快速,简单,健壮的网络通讯.支持网络图片的缓存加载功能. 适用场景:数据量不大,但是通 ...