C#Lambda表达式详解
Lambda表达式教程
|
本文提供全流程,中文翻译。 Chinar 坚持将简单的生活方式,带给世人! (拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例) |
|
Chinar —— 心分享、心创新! 助力快速理解 Lambda 表达式的用法、规范 为新手节省宝贵的时间,避免采坑! |
全文高清图片,点击即可放大观看 (很多人竟然不知道)
1
Lambda —— 表达式
Lambda 表达式是一个匿名函数,用它可以高效简化代码,常用作委托,回调
Lambda 表达式都使用运算符=>,所以当你见到这个符号,基本上就是一个 Lambda 表达式
Lambda 运算符的左边是输入参数(),=>,右边是表达式或语句块
Lambda 表达式,是可以访问到外部变量的
可以将此表达式分配给委托类型
/// <summary>
/// 控制台程序自己创建的一个测试类
/// </summary>
class Chinar
{
/// <summary>
/// 方法A
/// </summary>
/// <param name="a">整形</param>
/// <param name="b">整形</param>
/// <returns>整形</returns>
static int MethodA(int a, int b)
{
return a + b;
}
static void Main(string[] args)
{
//Lambda 表达式不需要声明类型,因为前边3个 int 定义过了 ;=>是固定格式
//有匿名函数的地方,就可以用 Lambda 表达式来代替
Func<int, int, int> lambda = (args1, args2) => { return args1 + args2; };
Console.WriteLine("表达式1:" + lambda(100, 1));
//当传入参数只有一个时,可省略很多
//不需要括号,不需要return关键字,编译器会自动完成添加
Func<int, int> lambda2 = a => a * a;
Console.WriteLine("表达式2:" + lambda2(9));
Console.ReadLine();
}
}
2
Parameter —— 参数
Lambda 只有一个参数时,可以省略括号
如果多个参数,则必须加括号,并且用,隔开
单参数 ,匿名函数:
x => x * x; //传入参数为:x,返回值为 x*x 的值
多参数 ,匿名函数:
(x, y) => x == y;//传入参数为:x,y,返回值为 bool 值
3
Empty return value —— 空返回值函数
当我们所需的函数返回值为空时,需要指定空返回值
无参数 ,无返回值,匿名函数:
using UnityEngine;
public class ChinarLambda : MonoBehaviour
{
delegate void ChinarDelegate(); //委托 ChinarDelegate ,空返回值,无参数
ChinarDelegate cd; //委托对象
void Start()
{
cd = () => { print("Chinar"); }; //无参数,无返回值,{函数代码块}:打印Chinar
cd(); //调用委托
}
}
运行结果:打印
Chinar
有参数 ,无返回值,匿名函数:
using UnityEngine;
public class ChinarLambda : MonoBehaviour
{
delegate void ChinarDelegate(int a, int b); //委托 ChinarDelegate ,空返回值,2个 Int 参数
ChinarDelegate cd; //委托对象
void Start()
{
cd = (a, b) =>{print(a); print(b);}; //传入参数为:a,b,{函数代码块}:分别打印 a b 的值
cd(1, 2); //调用委托
}
}
运行结果:打印
1
2
4
Lambda Statement —— 表达式 语句
当表达式,函数体有多个语句时,只需要将所有代码写入 { 方法体 }
有参数 ,无返回值,匿名函数:
using UnityEngine;
public class ChinarLambda : MonoBehaviour
{
delegate void ChinarDelegate(string str); //委托 ChinarDelegate ,空返回值,2个 Int 参数
ChinarDelegate cd; //委托对象
void Start()
{
cd = s =>
{
string str = s + "|" + s;
print(str);
}; //传入参数为:s,{函数代码块}:
cd("Chinar"); //调用委托
}
}
运行结果:打印
Chinar|Chinar
5
Example 1 —— 示例1
调用 LinQ 的 First 函数
First 函数会找到满足条件,最近的一个
a:是 strList 数组中的元素,如果元素的长度大于 5 返回满足条件的 a 元素
有参数 ,无返回值,匿名函数:
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
public class ChinarLambda : MonoBehaviour
{
void Start()
{
List<string> strList = new List<string>()//声明一个 string 列表,并添加数据
{
"ABC",
"123456",
"哈哈",
"1234567890"
};
string result = strList.First(a => a.Length > 5); //LinQ 的 First函数,a:是strList数组中的元素,如果元素的长度大于5;—— First 函数会找到满足条件,最近的一个
print(strList.First(a => a.Length > 5)); //Lambda 表达式的返回值是根据你的函数决定的,在此是string类型的返回值,所以可以直接写一句
}
}
运行结果:打印
123456
6
Example 2 —— 示例2
直接将用表达式代替委托类型,可大量精简代码量
using System;
using UnityEngine;
public class ChinarLambda : MonoBehaviour
{
void Start()
{
// 1
//传入参数是 Chinar,所以 s 此时就代表 "Chinar",因为在 LambdaFun 函数中 print(func(str)) 方法,是以传入参数,传给了委托
//在此经过了 Lambda 直接对 “Chinar” 进行处理,并返回处理后的字符串,直接打印
LambdaFun("Chinar", s => s.Replace("Chinar", "毋桐"));
// 2
//原理同上
LambdaFun("大侦探福尔马林", s =>
{
if (s.Contains("马林"))
{
s = s.Replace("马林", "摩斯");
}
return s;
});
}
/// <summary>
/// 测试表达式函数
/// </summary>
/// <param name="str">入参:字符串</param>
/// <param name="func">入参:Func委托</param>
public void LambdaFun(string str, Func<string, string> func)
{
print(func(str)); //打印 经过委托处理后返回的字符
}
}
运行结果:打印
123456
7
Toggle AddListener Lambda —— 动态添加监听方法 Lambda
再举个例子
在动态监听方法时,可直接简化/省略另建方法
并且 Lambda 表达式,可以访问到外部变量的
未完。。。
using UnityEngine;
using UnityEngine.UI;
/// <summary>
/// Chinar专用测试类
/// </summary>
public class ChinarDemo : MonoBehaviour
{
void Start()
{
//找到组件,动态添加监听,Lambda表达式,精简!外加三目运算
GameObject.Find("Toggle").GetComponent<Toggle>().onValueChanged.AddListener(isOn => print(isOn ? "开" : "关"));
}
/// <summary>
/// 直接可省略此方法 —— 监听方法:可手动/动态绑定
/// 二者效果一样
/// </summary>
/// <param name="isOn"></param>
public void OnClick(bool isOn)
{
if (isOn)
{
print("开");
}
else
{
print("关");
}
}
}
支持
May Be —— 搞开发,总有一天要做的事!
|
拥有自己的服务器,无需再找攻略! Chinar 提供一站式教程,闭眼式创建! 为新手节省宝贵时间,避免采坑! |
先点击领取 —— 阿里全产品优惠券 (享受最低优惠)
1 —— 云服务器超全购买流程 (新手必备!)
2 —— 阿里ECS云服务器自定义配置 - 购买教程(新手必备!)
3—— Windows 服务器配置、运行、建站一条龙 !
4 —— Linux 服务器配置、运行、建站一条龙 !
" role="presentation">
技术交流群:806091680 ! Chinar 欢迎你的加入
END
本博客为非营利性个人原创,除部分有明确署名的作品外,所刊登的所有作品的著作权均为本人所拥有,本人保留所有法定权利。违者必究
对于需要复制、转载、链接和传播博客文章或内容的,请及时和本博主进行联系,留言,Email: ichinar@icloud.com
对于经本博主明确授权和许可使用文章及内容的,使用时请注明文章或内容出处并注明网址
C#Lambda表达式详解的更多相关文章
- Lambda表达式详解(例子详解)(转自:http://blog.csdn.net/damon316/article/details/51734661)
Lambda表达式详解(例子详解) lambda简介 lambda运算符:所有的lambda表达式都是用新的lambda运算符 " => ",可以叫他,“转到”或者 ...
- Java 8 Lambda 表达式详解
一.Java 8 Lambda 表达式了解 参考:Java 8 Lambda 表达式 | 菜鸟教程 1.1 介绍: Lambda 表达式,也可称为闭包,是推动 Java 8 发布的最重要新特性. La ...
- 类型:.net;问题:C#lambda表达式;结果:Lambda表达式详解
Lambda表达式详解 前言 1.天真热,程序员活着不易,星期天,也要顶着火辣辣的太阳,总结这些东西. 2.夸夸lambda吧:简化了匿名委托的使用,让你让代码更加简洁,优雅.据说它是微软自c#1 ...
- JAVA8之lambda表达式详解
原文:http://blog.csdn.net/jinzhencs/article/details/50748202 lambda表达式详解 一.问题 1.什么是lambda表达式? 2.lambda ...
- Java8 Lambda表达式详解手册及实例
先贩卖一下焦虑,Java8发于2014年3月18日,距离现在已经快6年了,如果你对Java8的新特性还没有应用,甚至还一无所知,那你真得关注公众号"程序新视界",好好系列的学习一下 ...
- Lambda表达式详解
前言 1.天真热,程序员活着不易,星期天,也要顶着火辣辣的太阳,总结这些东西. 2.夸夸lambda吧:简化了匿名委托的使用,让你让代码更加简洁,优雅.据说它是微软自c#1.0后新增的最重要的功能之一 ...
- C# Lambda表达式详解,及Lambda表达式树的创建
最近由于项目需要,刚刚学完了Action委托和Func<T>委托,发现学完了委托就必须学习lambda表达式,委托和Lambda表达式联合起来,才能充分的体现委托的便利.才能使代码更加简介 ...
- Lambda表达式详解(转载)
原文链接:http://www.cnblogs.com/knowledgesea/p/3163725.html lambda简介 lambda运算符:所有的lambda表达式都是用新的lambda运算 ...
- (转)Lambda表达式详解
本文转载自:http://www.cnblogs.com/knowledgesea/p/3163725.html 前言 1.天真热,程序员活着不易,星期天,也要顶着火辣辣的太阳,总结这些东西. 2.夸 ...
- Lambda表达式详解 (转)
前言 1.天真热,程序员活着不易,星期天,也要顶着火辣辣的太阳,总结这些东西. 2.夸夸lambda吧:简化了匿名委托的使用,让你让代码更加简洁,优雅.据说它是微软自C#1.0后新增的最重要的功能之一 ...
随机推荐
- dubbo 框架和 tomcat 的比较
接触 dubbo 有一段时间,特别想拿 dubbo 和 tomcat 比较一番. tomcat 是 web 服务器,提供 http 服务,当 tomcat 收到浏览器发送的 http 请求时,根据 u ...
- shiro jwt 构建无状态分布式鉴权体系
一:JWT 1.令牌构造 JWT(json web token)是可在网络上传输的用于声明某种主张的令牌(token),以JSON 对象为载体的轻量级开放标准(RFC 7519). 一个JWT令牌的定 ...
- python(5)之集合
集合是一个无序的,不重复的数据组合,它的主要作用如下: 1.去重,把一个列表变为集合就自动去重了 2.关系测试,测试两组数据之间的交集.并集.差集等 常用操作如下: #集合的操作 list_1={1, ...
- 微服务之SpringCloud基础
SpringCloud微服务基础 微服务架构--SpringCloud网站架构模式 单点应用/分布式系统面向于服务架构(SOA) /微服务架构web项目三层架构1.控制层2.业务逻辑层3.数据访问层传 ...
- js之窗口位置
IE,Safari,Opera和Chrome都提供了screenLeft和screemTop属性,分别用于表示窗口相对于屏幕左边和上边的位置.FireFox则提供了screenX和screenY.使用 ...
- 普通程序员,三年成为年薪70w架构师,只因做到了这些
每个程序员.或者说每个工作者都应该有自己的职业规划,如果你不是富二代,不是官二代,也没有职业规划,希望你可以思考一下自己的将来.今天给大家分享的是一篇来自阿里Java架构师对普通程序员的职业建议,希望 ...
- bzoj1239
题解: 首先计算出两两之间的距离 然后二分答案 然后贪心判断是否可以放置少于等于k个 代码: #include<bits/stdc++.h> using namespace std; ; ...
- 使用DDMS查看设备内的文件系统
system文件系统存储了一些系统相关的文件 system/app里面是系统自带的应用程序 system/fonts里面存放的是系统自带的字体 system/frameworks里面存放的是系统的一些 ...
- Netty完成网络通信(二)
Netty是基于NIO的框架,完善了NIO的一些缺陷,因此可以用Netty替代NIO Netty实现通信步骤: 1.创建两个NIO线程组,一个专门用于网络事件处理(接受客户端的连接),另一个则进行网络 ...
- 四:(之四)基于已有镜像构建自己的Docker镜像
4构建自己的Docker镜像 4.1常用命令: 等同于docker commit 将一个被改变的容器创建成一个新的image 等同于docker build 通过Dockerfile创建一个image ...