学会Func

前言

首先你要会最基本的委托的使用,如果不会,看起来可能会有难度..

不过第一个例子将帮你复习一下委托delegate

接下来通过几个例子就会学会怎么灵活使用Func了

 

委托回顾(delegate)

      新建控制台

代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace AaronYangFuncDemo
{
    delegate string ConvertMethod(string inString); //①
    class Program
    {
        static void Main(string[] args)
        {
            ConvertMethod convertMeth = UppercaseString; //③
            string name = "AaBbCcDd";
            Console.WriteLine(convertMeth(name));
            Console.ReadLine();
        }
        private static string UppercaseString(string inputString)    //②
        {
            return inputString.ToUpper();
        }
    }
}

这是一个将传入的字符串转换成大写的委托

这里我们声明了一个

delegate string ConvertMethod(string inString);

委托可以理解为就是方法(委托定义的签名要和 方法的签名一致(什么返回类型,什么参数列表))的集合,然后可以使用+=绑定同方法签名的方法

然后调用委托名字,传入对应的参数,就可以通过委托间接调用了方法。(纯属个人白话文理解)

效果:

接下来看看 Func

可见Func也是一个泛型委托,第一个参数,是传入参数,等同于

后面一个TResult等同于

所以我们修改一下代码,简化一下代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace AaronYangFuncDemo
{
   // delegate string ConvertMethod(string inString); //①
    class Program
    {
        static void Main(string[] args)
        {
        //    ConvertMethod convertMeth = UppercaseString; //③
 
            Func<string, string> convertMeth = UppercaseString;
            string name = "AaBbCcDd";
            Console.WriteLine(convertMeth(name));
            Console.ReadLine();
        }
        private static string UppercaseString(string inputString)    //②
        {
            return inputString.ToUpper();
        }
    }
}

方法签名的参数是 string类型的,输出也是string类型的,这里的T(该类型参数是逆变的)和TResult(该类型参数是协变的)

关于泛型中的逆变和协变,这里不讲

 

Func<T,TResult>委托 和 匿名方法结合

看代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace AaronYangFuncDemo
{
   // delegate string ConvertMethod(string inString); //①
    class Program
    {
        static void Main(string[] args)
        {
        //    ConvertMethod convertMeth = UppercaseString; //③
 
            string name = "AaBbCcDd";
            //Func<string, string> convertMeth = UppercaseString;
            //Console.WriteLine(convertMeth(name));
            Func<string, string> convertMeth2 = delegate(string s)
            { return s.ToUpper(); };
            Console.WriteLine(convertMeth2(name));
            Console.ReadLine();
        }
 
    }
}

delegate会用的都是知道的,      delegate(方法的参数){ 方法体 }

既然匿名方法可以使用,那么lambda表达式也可以用,我们再简化一下代码

s通过传入参数是string的,所以vs可以推断出来,这个s是string类型的,所以你可以使用string的方法操作参数,最终返回TResult的是string类型就行了。

这样子,我们已经很简化代码了

 

Func<T,TResult>委托 和 LINQ一些方法结合

过程:

声明一个数组

 string[] words = { "aaron", "yang", "funcdemo" };

通过LINQ将这个数组中变成大写的

我们使用数组的select方法,发现,这样的一个参数

所以我们在操作之前,先声明个Func<string,TResult>   TResult由最终保存的IEnumerable<TResult>的TResult决定,这里也是string

所以声明一个Func<string,string> 的选择器

整体代码:

为了更进一步了解Func,我们要求输出这样的结果

AARON  =>  A***N

YANG => Y**G

等等

代码如下:

//综合
            string[] words = { "aaron", "yang", "funcdemo" };
            Func<string, char[]> selector = str => str.ToUpper().ToCharArray();
             IEnumerable<char[]> enWords = words.Select(selector);
             foreach (char[] item in enWords)
             {
                 int itemlength = item.Length;
                 IEnumerable<string> endStr = Enumerable.Repeat("*", item.Length - 2);
                 Console.WriteLine(
                     new string(item)+" => "+
                     item[0].ToString()+String.Join("", endStr)+ item[itemlength - 1].ToString());
             }
            Console.ReadLine();

效果图

同理传入参数是对象,一个实例,然后操作属性等等

同理

作为Func的传入参数当然不止一个,可以有多个,等同于一个方法含有多个参数,这里做多16个传入参数,每一种必然有一个返回类型参数了。如果没有返回参数,那么你可以使用  Action<T>委托尝试,这里不做讲解

学会Func的更多相关文章

  1. 那天有个小孩跟我说LINQ(八)学会Func

    文章已经迁移到:http://www.ayjs.net/2013/08/68/ 文章已经迁移到:http://www.ayjs.net/2013/08/68/ 文章已经迁移到:http://www.a ...

  2. 简简单单学会C#位运算

    一.理解位运算 要学会位运算,首先要清楚什么是位运算?程序中的所有内容在计算机内存中都是以二进制的形式储存的(即:0或1),位运算就是直接对在内存中的二进制数的每位进行运算操作 二.理解数字进制 上面 ...

  3. 一周学会go语言并应用 by王奇疏

    <一周学会go语言并应用> by王奇疏 ( 欢迎加入go语言群: 218160862 , 群内有实践) 点击加入 零.安装go语言,配置环境及IDE 这部分内容不多,请参考我的这篇安装环境 ...

  4. 10天学会phpWeChat——第六天:实现新闻的后台管理

    通过前面五讲的系列教程,我们完成了一个简单模块的前端发布.列表展示.详情展示.实际生产环境中,所有前台的数据都会有对应的后台操作进行统筹管理.我们称之为后台管理系统. 今天,我们开始<10天学会 ...

  5. 10天学会phpWeChat——第二天:hello world!我的第一个功能模块

    今天我们开始进入<10天学会phpWeChat>系列教程的第二天:创建我的第一个hello world! 功能模块. 1.登录后台,进入 系统设置--自定义模块,如图: 自定义模块参数说明 ...

  6. 10天学会phpWeChat——第一天:核心框架的目录结构

    phpWeCaht是一款优秀的PC网站+微信公共号开发框架. 本博客系列将图文结合,详细介绍phpWeChat 的使用方法,今天进入phpWeChat系列教程之<10天学会phpWeChat&g ...

  7. Python入门教程 超详细1小时学会Python(转)

    假设我们有这么一项任务:简单测试局域网中的电脑是否连通.这些电脑的ip范围从192.168.0.101到192.168.0.200. 思路:用shell编程.(Linux通常是bash而Windows ...

  8. Func和Action委托简单用法

    Func和Action类是特殊的类型,它们允许你在不必指定自定义委托类型的情况下,去使用委托.在整个.NET框架中都可以使用它们.例如,在我们考察并行计算时,你也会看到这两个类的示例. 上面一段文字是 ...

  9. iOS项目开发实战——学会使用TableView列表控件(四)plist读取与Section显示

    文本将会实现把数据存储到plist文件里.然后在程序中进行读取.在TableView控件中依据不同的类别显示Section. 有关TableView 的其它实现,请參考<iOS项目开发实战--学 ...

随机推荐

  1. 2014阿里巴巴研发project师暑期实习生面试经验

    2014阿里巴巴研发project师暑期实习生面试经验 作者:林子 Blog:  http://blog.csdn.net/u013011841 时间:2014年8月 出处:http://blog.c ...

  2. Ionic项目中使用极光推送-android

    对于Ionic项目中使用消息推送服务,Ionic官方提供了ngCordova项目,这个里面的提供了用angularjs封装好的消息推送服务(官方文档),使用的是GitHub上的 PushPlugin ...

  3. C#中如何获取系统环境变量

    原文:C#中如何获取系统环境变量 C#中获取系统环境变量需要用到Environment Class.其中提供了有关当前环境和平台的信息以及操作它们的方法.该类不能被继承. 以下代码得到%systemd ...

  4. 有空就写个C++程序

    近期工作变得轻松了非常多,有了一些空暇的时间,准备把大学时候的C++抓起来,而且研究研究算法: 第一个C++程序:计算圆的面积,也是看其它的博客写出来的C++程序. #include<iostr ...

  5. 伺服驱动器UVW电机电源线相序错误

       我们有必要先了解此讨论的前提:编码器初始安装相位正确.伺服驱动器将全然"採信"电机编码器的初始安装相位所表征的电机电角度相位,无需在伺服电机 的UVW动力线接线连接后进行额外 ...

  6. 发现新大陆:一个最简单的破解SSL加密网络数据包的方法

    1. 简介 相信能访问到这篇文章的同行基本上都会用过流行的网络抓包工具WireShark,用它来抓取相应的网络数据包来进行问题分析或者其他你懂的之类的事情. 一般来说,我们用WireShark来抓取包 ...

  7. Java获取.properties配置文件某一项value根据key值

    public static String getProperty(String key){ InputStream in = PropertiesUtils.class.getResourceAsSt ...

  8. javascript and dom1

    <script type="text/javascript"> //数组 var beatles=Array(4); var beatles=Array(); cons ...

  9. Windows在结构objective C开发环境

    对于近期打算iPhone.iPod touch和iPad开发一些应用程序,所以.需要开始学习Objective C(苹果推出的类似C语言的开发语言).因为苹果的自我封闭的产业链发展模式(从芯片.机器. ...

  10. MSSQL2008数据库备份还原和数据恢复

    原文:MSSQL2008数据库备份还原和数据恢复   序言 一直想写一篇关于数据库备份与恢复的文章,但基于能力的有限对数据库认知的有限怕不足以准确的表达,最后思考很久还是决定把自己的一些理解写出来供大 ...