C# 6 元组应用 Part 2:C# 也玩模式匹配
C# 7给我们带来了一个半吊子的 switch 语句模式匹配,只能简单的匹配类型而已,完全没有什么用处。这里我提供个更好的简单实现,用 C# 6 的 ValueTuple 模拟函数式语言的模式匹配功能。
首先就是实现:
public static class ValueTupleExtensions
{ /// <summary>
/// 至少匹配一个条件
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name=""></param>
/// <returns></returns>
public static TResult MatchOne<TResult>(params (Func<bool> condExpr, Func<TResult> resultExpr)[] pairs)
{
foreach (var pair in pairs)
{
if (pair.condExpr())
{
return pair.resultExpr();
}
}
throw new InvalidOperationException("无匹配的表达式");
} /// <summary>
/// 匹配默认或指定的条件
/// </summary>
/// <typeparam name="TResult"></typeparam>
/// <param name="defaultMatch"></param>
/// <param name="matchs"></param>
/// <returns></returns>
public static TResult MatchOneOrDefault<TResult>(
Func<TResult> defaultMatchExpr,
params (Func<bool> condExpr, Func<TResult> resultExpr)[] matchs)
{
foreach (var pair in matchs)
{
if (pair.condExpr())
{
return pair.resultExpr();
}
} return defaultMatchExpr();
} public static TOutput MatchOne<TInput, TOutput>(TInput inputValue, params (TInput matcheValue, Func<TOutput> resultValueExpr)[] pairs)
where TInput : IEquatable<TInput>
{
foreach (var pair in pairs)
{
if (inputValue.Equals(pair.matcheValue))
{
return pair.resultValueExpr();
}
} throw new InvalidOperationException("无匹配的值");
} public static TOutput MatchOneOrDefault<TInput, TOutput>(TInput inputValue, params (TInput matcheValue, Func<TOutput> resultValueExpr)[] pairs)
where TInput : IEquatable<TInput>
{
if (inputValue == null)
{
throw new ArgumentNullException(nameof(inputValue));
} foreach (var pair in pairs)
{
if (pair.matcheValue == null)
{
throw new ArgumentNullException(nameof(pairs));
} if (inputValue.Equals(pair.matcheValue))
{
return pair.resultValueExpr();
}
}
return default(TOutput);
}
}
然后用起来就非常简单了,首先使用 `using static` 引入静态函数:
using static ValueTupleExtensions;
然后我们实际操练下:
class Program
{
static void Main(string[] args)
{
var a = ; //最简单的重载,与某个值相等就执行后面的 lambda 表达式
var matched = MatchOne(
a,
(, () => ""),
(, () => "")
); Console.WriteLine($"matched={matched}"); //更自由的形式,第一个 lambda 相当于 if
matched = MatchOne(
(() => a == , () => ""),
(() => a == , () => "")
); Console.WriteLine($"matched={matched}"); Console.ReadKey();
}
}
虽然括号略多,不过还是很好玩的吧。
Have fun!
C# 6 元组应用 Part 2:C# 也玩模式匹配的更多相关文章
- Scala中的元组
元组 元组使用()表示的数据结构 元组使用()表示的数据结构 还可以使用模式匹配访问 使用场景非常有限,用于函数返回值不止1个的情况下 看代码: /** * 元组 * @author Administ ...
- 《快学Scala》——数组、映射和元组
数组 定长数组:在Scala中可以用Array,初始化一个定长数组.例如: val nums = new Array[Int](10) //10个整数的数组,所有元素初始化为0 val a = new ...
- erlang程序设计--顺序编程
erlang模块的基本结构 基本结构-module(filename).-export([funname/num]). c(filename). 编译erlang模块 .bean 结尾的文件 编译后 ...
- 代码演示C#各版本新功能
代码演示C#各版本新功能 C#各版本新功能其实都能在官网搜到,但很少有人整理在一起,并通过非常简短的代码将每个新特性演示出来. 代码演示C#各版本新功能 C# 2.0版 - 2005 泛型 分部类型 ...
- python 数据类型 -- 元组
元组其实是一种只读列表, 不能增,改, 只可以查询 对于不可变的信息将使用元组:例如数据连接配置 元组的两个方法: index, count >>> r = (1,1,2,3) &g ...
- 【.NET深呼吸】元组数据(Tuple)
各位观众,大家好,欢迎收看由火星电视台直播的<老周吹牛>节目,注意:本节目没有任何技术含量,如果您没有兴趣,请砸掉电视机. 今天说一下System命名空间下的一个数据类型——Tuple,翻 ...
- python学习笔记(列表、元组、购物车实例)
一.列表 列表和字典是最常用的两种数据类型 1. 需求:怎么存放班级80多人的姓名,如何实现? names = ["Zhangyang","Guyun",&qu ...
- python之最强王者(7)——元组(tuple)
1.序列(sequence): 说明:在前面的字符串列表中其实我们已经用到了序列,之所以放到这篇来讲主要是为了承上启下,方便理解和记忆. python的数据访问模型:直接存取 ,序列 ,映射 对非容器 ...
- Python元组
Python的元组与列表类似,不同之处在于元组的元素不能修改. 元组使用小括号,列表使用方括号. 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可. 如下实例: tup1 = ('physi ...
随机推荐
- # postgresql-shared_buffers
关于shared_buffers 什么是shred_buffer,我们为什么需要shared_buffers? 1.在数据库系统中,我们主要关注磁盘io,大多数oltp工作负载都是随机io,因此从磁盘 ...
- python多线程获取子线程任务返回值
今天想实现多线程更新资产信息,所以使用到了threading,但是我需要每个线程的返回值,这就需要我在threading.Thread的基础上进行封装 def auto_asset(node): re ...
- jvm-垃圾回收gc简介+jvm内存模型简介
gc是jvm自动执行的,自动清除jvm内存垃圾,无须人为干涉,虽然方便了程序员的开发,但同时增加了开发人员对内存的不可控性. 1.jvm内存模型简介 jvm是在计算机系统上又虚拟出来的一个伪计算机系统 ...
- Base 64 加密、解密
1.写一个公共类 package com.boyutec.oss.sys.utils; import java.io.UnsupportedEncodingException; import java ...
- 安尼泰科T1行车记录仪说明书
点击下载:安尼泰科T1行车记录仪说明书 自己总结:行车记录仪_使用总结.rar PS:我的型号是T1C,但说明书也适合.
- antd tree组件文件名换行 + 点击展开时,自动收起同级其他展开目录
1.在项目中用 antd的tree组件的时候,遇到两个问题 1.文件名太长的话 会超出容器 很难看,解决方法如下 ` 引入css在global下设置 :global { .ant-tree li .a ...
- 从零开始学 Web 之 移动Web(四)实现JD分类页面
大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...
- Spring Cloud Ribbon入门
一.简介 Spring Cloud Ribbon是一个基于Http和TCP的客户端负载均衡工具,它是基于Netflix Ribbon实现的.它不像服务注册中心.配置中心.API网关那样独立部署,但是它 ...
- [译]ABP vNext介绍
译者注 ASP.NET Boilerplate是.Net平台非常优秀的一个开源Web应用程序框架,在国内也有大量的粉丝. 近日, 本人在github上闲逛, 发现ASP.NET Boilerplate ...
- [BZOJ 4671]异或图
Description 题库链接 给定 \(s\) 个结点数相同且为 \(n\) 的图 \(G_1\sim G_s\) ,设 \(S = \{G_1, G_2,\cdots , G_s\}\) ,问 ...