学会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. 讨论IT选定的技术招聘企业几点

    在实际的招聘总结的几点思考,企业需要怎么样的人才,例如,以下个人总结: 1.技术能力是不是第一次 企业的时候,你往往看第一点的人的招聘是不是技术实力.但是,你的个人言论的行为和态度.能在半个小时内把你 ...

  2. 6、Cocos2dx 3.0游戏开发的基本概念找个小三场比赛

    重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27689713 郝萌主友情提示: 人是习惯的产物,当你 ...

  3. java环境变量配置四种方法

    原文:java环境变量配置四种方法 Java编程首要工作就是安装JDK(Java Development Kit).一通“NEXT”点完安装后就是最重要的环境变量设置了.也许有人会问为什么要设置环境变 ...

  4. HDU1342 Lotto 【深搜】

    Lotto Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  5. C语言对mysql数据库的操作

    原文:C语言对mysql数据库的操作 这已经是一相当老的话题.不过今天我才首次使用,把今天的一些体会写下来,也许能给一些新手带来一定的帮助,更重要的是供自己今后忘记的怎么使用而进行查阅的! 我们言归正 ...

  6. Android小应用-----画画板

    public class MainActivity extends Activity { private ImageView iv; float startX = 0; float startY = ...

  7. 《那些年,我们拿下FPGA》做笔记

    spld.cpld和fpga等可不管什么样的逻辑是大自然来实现.任何逻辑可以由多项式来表示(要么逼关闭).比多项式乘法和处理操作仅此而已. 而就.您可以在门线上用.或门添加剂. fpga扩展架构SOP ...

  8. Linux下的C程序如何调用系统命令,并获取系统的输出信息到C程序中

    直接贴代码: #include <stdio.h> #include <string.h> #include <errno.h> int main(int argc ...

  9. 你不知道的 页面编码,浏览器选择编码,get,post各种乱码由来

    原文:你不知道的 页面编码,浏览器选择编码,get,post各种乱码由来 asp.net页面编码和浏览器的选择编码 每个asp.net的朋友都知道,在新版本的visual studio,在没有任何设置 ...

  10. iOS生命周期 & 通知中心

    笔记内容 学习笔记-段玉磊 Stanford course View Controller Lifecycle 这篇文是我记载Developing iOS 7 Apps公开课 第5课的笔记 UITex ...