C# 8 的模式匹配
C# 7 里面的Pattern Mathing
is 模式
switch 和 when
C# 8 里面的Pattern Matching
使用Deconstructor 和 位置匹配模式
下面两个类Teacher和Student都由构造函数(Constructor)和Deconstructor:
下面我想写一个方法判断学生是不是5年级并且是学数学的:
这里我们就用到了Student的Deconstructor和位置匹配模式,这里面的下划线叫做“discard”(丢弃),表示我们不会使用它不关心它。
如果代码这样写,那么传进来的任何学生都满足这个匹配。
如果想判断5年纪的学生,我们可以这样写:
还想判断他的老师是否教数学,可以这样写:
注意,这里面调用的都是Deconstructor。
实际上,我们可以把Deconstructor的类型去掉,像这样:
实际上针对这种需求,使用if语句可能更好,更容易维护。但是如果循环嵌套的情况下无法使用if,那么这种位置模式匹配就有用了。
属性匹配模式
位置匹配模式很强大,但是可阅读性太差,下面看看属性匹配模式。
还是之前的需求:
我想这个一看就明白,不需要解释了吧?
而且这个方法可以写的更通用一些:
参数类型改为object,然后先判断它是不是Student,在判断是否是5年级学数学的。
Swtich 表达式
有三个形状的类,它们的属性各不相同:
下面我要写一个方法,根据不同的形状,显式相应的信息。这里我会使用C# 8 的 switch表达式。
先从最简单的只有一种情况开始:
方法参数的类型是object,然后使用C# 8的switch表达式,该表达式有返回值,所以可以把返回值放到变量里面然后返回。
可以看到,switch表达式里面没有case 关键字,这里使用的是lambda表达式。
这句话的意思就是,如果shape是Rectangle类型的,那么我们可以通过r这个变量来访问它,右侧的字符串就是这个case表达式的值,这里的返回值就是一个字符串。
把三个形状都写上,就是这样:
注意,这里没有break或者return。并且switch表达式不支持“接盘”(fall through)。
那么默认情况怎么添加呢?这里我们使用discard匹配模式:
这里我们还可以使用属性匹配模式来设置过滤条件:
使用嵌套的switch表达式,也可以达到同样的目的:
最后我们可以让整个方法更简化一点,使用expression-bodied方法:
但还是不要过度使用这种嵌套的模式,毕竟人类还需要阅读你的代码。。。
元组匹配模式
先定义一个枚举:
然后写一个方法,传进两个颜色,得到混合后的颜色:
这里面用的就是元组匹配模式。
最下面还判断了两种颜色都一样的情况,以及其它所有情况。
C# 8 的模式匹配的更多相关文章
- XSL学习笔记4 XSLT模式匹配的语法
模板规则通过使用模式来匹配文档树的节点.模式指定一组条件,用于选择要处理的节点. 模式匹配的语法不光可以在<xsl:template>元素的match属性中使用,还可以在<xsl ...
- 字符串模式匹配之KMP算法图解与 next 数组原理和实现方案
之前说到,朴素的匹配,每趟比较,都要回溯主串的指针,费事.则 KMP 就是对朴素匹配的一种改进.正好复习一下. KMP 算法其改进思想在于: 每当一趟匹配过程中出现字符比较不相等时,不需要回溯主串的 ...
- Redis模式匹配删除key
Redis keys命令支持模式匹配,但是del命令不支持模式匹配,有时候需要根据一定的模式来模糊删除key,这时只能结合shell命令来完成了. 具体命令是: redis-cli KEYS &quo ...
- php glob()函数实现目录文件遍历与寻找与模式匹配的文件路径
采用PHP函数glob实现寻找与模式匹配的文件路径,主要讨论glob()函数的作用和用法,利用glob函数读取目录比其它的要快N倍,因为glob函数是内置函数处理起来自然要快. 一,函数原型 arra ...
- Scala的模式匹配
1.概述 2.程序示例(普通的示例) 3.模式匹配(Array) 4.程序示例(Array) 5.模式匹配(List) 6.程序示例 7.遍历 8.模式匹配(case class) 9.程序示例(传统 ...
- 求子串-KPM模式匹配-NFA/DFA
求子串 数据结构中对串的5种最小操作子集:串赋值,串比较,求串长,串连接,求子串,其他操作均可在该子集上实现 数据结构中串的模式匹配 KPM模式匹配算法 基本的模式匹配算法 //求字串subStrin ...
- Oracle 12c 的新功能:模式匹配查询
模式匹配SQL 在一系列的数据行中辨识出某种模式是一种广泛需求的功能,但在以前的SQL中是不可能的.有许多解决方法,但这些都很难写,很难理解,而且执行效率低下.在Oracle数据库中,从12c开始,你 ...
- 【模式匹配】KMP算法的来龙去脉
1. 引言 字符串匹配是极为常见的一种模式匹配.简单地说,就是判断主串\(T\)中是否出现该模式串\(P\),即\(P\)为\(T\)的子串.特别地,定义主串为\(T[0 \dots n-1]\),模 ...
- JavaScript学习笔记-用于模式匹配的String方法
用于模式匹配的String方法: String支持4种使用正则表达式的方法: seach()用于检索,参数是一个正则表达式,返回第一个与之匹配的子串的位置,找不到则返回-1,如 ...
- 浅析正则表达式模式匹配的String方法
在JavaScript代码中使用正则表达式进行模式匹配经常会用到String对象和RegExp对象的一些方法,例如replace.match.search等方法,以下是对一些方法使用的总结. Stri ...
随机推荐
- PAT 天梯杯 L2-020 功夫传人
L2-020. 功夫传人 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 一门武功能否传承久远并被发扬光大,是要看缘分的.一般来 ...
- ui、li模拟下拉框
转载:原文地址:https://www.jianshu.com/p/e303e0298e9e 效果图: HTML: <div class="rank_top"> < ...
- POJ 2488 A Knight's Journey (DFS)
poj-2488 题意:一个人要走遍一个不大于8*8的国际棋盘,他只能走日字,要输出一条字典序最小的路径 题解: (1)题目上说的"The knight can start and end ...
- 【Offer】[28] 【对称的二叉树】
题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 请实现一个函数,用来判断一-棵二叉树是不是对称的.如果一棵二叉树和它的镜像一样,那么它是对称的.  牛客网刷题地址 思路分析 利用前序 ...
- docker 搭建小型的node开发环境。
选择daocloud的镜像源----快.不多说 镜像的准备: docker pull docker.io/node 下载node镜像 docker pull daocloud.io/nginx 下载n ...
- 6.final和static
一.final final修饰类表示该类为最终类,不可被继承. final修饰方法表示该方法为最终方法,不可被重写. final修饰属性表示该属性不可变,不可变有两种含义.当其修饰基本类型变量时表明其 ...
- 类似Flag counter被园子禁用后的备选方案
背景介绍 2019年9月4日,园子发生严重事故,影响范围为整个园子.随着bug的修复,从个人博客无法访问——>公告栏部分功能禁用——>文件无法上传(多个文章中的图片均加载不出来)——> ...
- 个人微信Hook-C#Demo开发SDK
目录 基础信息类 好友操作 群操作类 发送信息 接收信息 Demo源码 基础信息类 获取个人信息 从网络获取群成员信息 从网络获取个人信息 获取公众号信息 获取群组信息 获取群成员信息 获取单个好友信 ...
- Python虚拟环境管理工具virtualenvwrapper安装及配置
1. 安装virtualenv 使用pip install virtualenv安装virtualenv虚拟环境工具 2. 安装virtualenvwrapper a) Linux环境,直接使用p ...
- .netCore部署在IIS上遇到的问题(500.19,500.21错误)
1.确保IIS功能都安装上了. 2.确保.netcore 的最新sdk已安装. 3.应用程序池改成无托管代码 4.500.19错误 错误原因,没有安装 DotNetCore.2.0.5-Windows ...