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> 委托的由来和调用和好处(为了高大上,为了白富美)的更多相关文章

  1. 参考例子,学习Func<T, TResult>委托

    这些天,开发ASP.NET MVC,其间有查找资料,发现一个全新的Func<T, TResult> 委托.让我们在开发时,节省与简化很多. 在开发过程中,我们需要把一个泛型List< ...

  2. Func<T, TResult> 委托

    Func<T, TResult> 委托 Visual Studio 2008   命名空间:  System程序集:  System.Core(在 System.Core.dll 中) 语 ...

  3. func 和action 委托的使用

    func 可以带返回值,action  不带返回值 平时我们如果要用到委托一般都是先声明一个委托类型,比如: private delegate string Say(); string说明适用于这个委 ...

  4. Expression<Func<T,TResult>>和Func<T,TResult>

    1.Expression<Func<T,TResult>>是表达式 //使用LambdaExpression构建表达式树 Expression<Func<int, ...

  5. Func<T,TResult>泛型委托

    描述: 封装一个具有一个参数并返回TResult参数指定的类型值的方法. 语法: public delegate TResult Func<T,TResult>(T arg); 参数类型: ...

  6. C# 笔记 Func<TResult> 委托、Action<T> 委托

    https://blog.csdn.net/wanglui1990/article/details/79303894 Func<ΤResult> 委托:代理(delegate)一个返回类型 ...

  7. 使用Func<T1, T2, TResult> 委托返回匿名对象

    Func<T1, T2, TResult> 委托 封装一个具有两个参数并返回 TResult 参数指定的类型值的方法. 语法 public delegate TResult Func< ...

  8. Func<T,TResult>的使用方法(转载)

    public delegate TResult Func <T, TResult>(T arg) 这是一个委托方法,这个方法有一个参数T(T arg),比如int arg,string a ...

  9. Func 和 Action 委托

    有了泛型委托,就有了一能适用于任何返回类型和任意参数(类型和合理的个数)的通用委托,Func 和 Action.如下所示(下面的in表示参数,out表示返回结果): delegate TResult ...

随机推荐

  1. android真机自动化测试

    appium执行用例时报错问题: 问题解析: 一般该种情况都是因为来连接了多个设备,验证办法:cmd->执行adb devices  看结果是否是多个devices ,如果是这个问题,停掉多余设 ...

  2. eclipse创建python项目

    http://jingyan.baidu.com/article/19192ad8173300e53f570757.html

  3. lintcode: 左填充

    题目 实现一个leftpad库,如果不知道什么是leftpad可以看样例 样例 leftpad("foo", 5) >> " foo" leftpa ...

  4. iOS:核心动画之关键帧动画CAKeyframeAnimation

    CAKeyframeAnimation——关键帧动画 关键帧动画,也是CAPropertyAnimation的子类,与CABasicAnimation的区别是: –CABasicAnimation只能 ...

  5. HDU 4629 Burning 几何 + 扫描线

    总体思路参考了 这里. 细节:1.控制精度,虽然这题没卡精度,不过还是要控制一下. 之前 bool operator<( const Point& A, const Point& ...

  6. JSP或HTML命名规范

    1.jsp与html文件名全部小写 2.数据/内容显示页 名词形式,多个单词用下划线分隔,要求能说明显示内容的信息,为避免冲突,可加上“_list”或者其他的单词.例如:news_message.ht ...

  7. Zend13.0 +XAMPP3.2.2 调试配置

    Zend 调试PHP有3种方式: (1)PHP CLI APPLICATION (2)PHP Web Application (3)PHP UnitTest (1).(2)两种方式配置相似,下图是配置 ...

  8. 关于c#字典key不存在的测试

    之前一直隐约记得没有创建key会报异常,测试了下. 测试结果: 写入值,如果不存在key,会自动创建. 取值,如果不存在key,会报异常. 一般用c#提供了尝试取值方法,不过有out参数,考虑写扩展 ...

  9. mmm hardware/libhardware_legacy/power/

    android源码目录下的build/envsetup.sh文件,描述编译的命令 - m:       Makes from the top of the tree.  - mm:      Buil ...

  10. 35.3wCF编程

    1.新建一个空白的解决方案文件,然后添加新建项目,项目类型为WCF服务应用程序,CH35Ex01 2.添加新建控制台应用程序Ch35Ex01Client 3.生成解决方案 4.右键Ch35Ex01Cl ...