学会Func
学会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的更多相关文章
- 那天有个小孩跟我说LINQ(八)学会Func
文章已经迁移到:http://www.ayjs.net/2013/08/68/ 文章已经迁移到:http://www.ayjs.net/2013/08/68/ 文章已经迁移到:http://www.a ...
- 简简单单学会C#位运算
一.理解位运算 要学会位运算,首先要清楚什么是位运算?程序中的所有内容在计算机内存中都是以二进制的形式储存的(即:0或1),位运算就是直接对在内存中的二进制数的每位进行运算操作 二.理解数字进制 上面 ...
- 一周学会go语言并应用 by王奇疏
<一周学会go语言并应用> by王奇疏 ( 欢迎加入go语言群: 218160862 , 群内有实践) 点击加入 零.安装go语言,配置环境及IDE 这部分内容不多,请参考我的这篇安装环境 ...
- 10天学会phpWeChat——第六天:实现新闻的后台管理
通过前面五讲的系列教程,我们完成了一个简单模块的前端发布.列表展示.详情展示.实际生产环境中,所有前台的数据都会有对应的后台操作进行统筹管理.我们称之为后台管理系统. 今天,我们开始<10天学会 ...
- 10天学会phpWeChat——第二天:hello world!我的第一个功能模块
今天我们开始进入<10天学会phpWeChat>系列教程的第二天:创建我的第一个hello world! 功能模块. 1.登录后台,进入 系统设置--自定义模块,如图: 自定义模块参数说明 ...
- 10天学会phpWeChat——第一天:核心框架的目录结构
phpWeCaht是一款优秀的PC网站+微信公共号开发框架. 本博客系列将图文结合,详细介绍phpWeChat 的使用方法,今天进入phpWeChat系列教程之<10天学会phpWeChat&g ...
- Python入门教程 超详细1小时学会Python(转)
假设我们有这么一项任务:简单测试局域网中的电脑是否连通.这些电脑的ip范围从192.168.0.101到192.168.0.200. 思路:用shell编程.(Linux通常是bash而Windows ...
- Func和Action委托简单用法
Func和Action类是特殊的类型,它们允许你在不必指定自定义委托类型的情况下,去使用委托.在整个.NET框架中都可以使用它们.例如,在我们考察并行计算时,你也会看到这两个类的示例. 上面一段文字是 ...
- iOS项目开发实战——学会使用TableView列表控件(四)plist读取与Section显示
文本将会实现把数据存储到plist文件里.然后在程序中进行读取.在TableView控件中依据不同的类别显示Section. 有关TableView 的其它实现,请參考<iOS项目开发实战--学 ...
随机推荐
- 深入理解C指针之二:C内存管理
原文:深入理解C指针之二:C内存管理 内存管理对所有程序来说都很重要.有时候内存由运行时系统隐式的管理,比如为变量自动分配内存.在这种情况下,变量分配在它所处的函数的栈帧上(每个函数都有它自己的栈帧, ...
- 有趣Web之Json(四)---json与(Object/List/Map)相互转化
干web报名时间.通常,他们需要json转换为Object/list/map要么Object/List/map转换为json,由能够编写代码的简单包装非常多,以减轻负担. 本文将给出json的一系列的 ...
- MySql状态查看方法 MySql如何查看连接数和状态?
原文:MySql状态查看方法 MySql如何查看连接数和状态? 如果是root帐号,你能看到所有用户的当前连接.如果是其它普通帐号,只能看到自己占用的连接 怎么进入mysql命令行呢? mysql的安 ...
- SqlDataReader的关闭问题
原文:SqlDataReader的关闭问题 昨天一个朋友使用Repeater绑定数据源时,老是出现"阅读器关闭时尝试调用 FieldCount 无效."错误. 我看了他的代码,使用 ...
- Thrift实践
Thrift实践:(一)安装 -- 未完待续 1. 新建一个目录,C:\test\thrift-test,里面建2个子文件夹,client-node和sever-csharp,然后把Thrift官 ...
- jmeter java请求
demo下载地址http://yun.baidu.com/share/link?shareid=4277735898&uk=925574576 1.引用jmeter的jar包 到jmeter的 ...
- 实例学习SSIS(一)--制作一个简单的ETL包
原文:实例学习SSIS(一)--制作一个简单的ETL包 导读: 实例学习SSIS(一)--制作一个简单的ETL包 实例学习SSIS(二)--使用迭代 实例学习SSIS(三)--使用包配置 实例学习SS ...
- .Net中批量更新或添加数据
方法一:使用SqlBulkCopy实现批量更新或添加数据. SqlBulkCopy类一般只能用来将数据批量插入打数据库中,如果数据表中设置了主键,出现重复数据的话会报错,如果没有设置主键,那么将会添加 ...
- postal邮件发送(二):Email headers,附件,图片介绍
接上篇 http://www.cnblogs.com/mybky/p/5690567.html 1.邮件headers 除此之外,还有Reply-To,用于回复邮箱 2.邮件带有图片 邮件发送图片,p ...
- codeblock 设置背景颜色
今天觉得codeblock看着刺眼,想了想,能不能跟vs利用dark背景一样可以设置一个舒服的背景.于是就开始各种点击,各种摸索了. 1. 背景和各种颜色设置 不妨先说下vs中的设置是:工具(Tool ...
