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# 也玩模式匹配的更多相关文章

  1. Scala中的元组

    元组 元组使用()表示的数据结构 元组使用()表示的数据结构 还可以使用模式匹配访问 使用场景非常有限,用于函数返回值不止1个的情况下 看代码: /** * 元组 * @author Administ ...

  2. 《快学Scala》——数组、映射和元组

    数组 定长数组:在Scala中可以用Array,初始化一个定长数组.例如: val nums = new Array[Int](10) //10个整数的数组,所有元素初始化为0 val a = new ...

  3. erlang程序设计--顺序编程

    erlang模块的基本结构 基本结构-module(filename).-export([funname/num]). c(filename). 编译erlang模块  .bean 结尾的文件 编译后 ...

  4. 代码演示C#各版本新功能

    代码演示C#各版本新功能 C#各版本新功能其实都能在官网搜到,但很少有人整理在一起,并通过非常简短的代码将每个新特性演示出来. 代码演示C#各版本新功能 C# 2.0版 - 2005 泛型 分部类型 ...

  5. python 数据类型 -- 元组

    元组其实是一种只读列表, 不能增,改, 只可以查询 对于不可变的信息将使用元组:例如数据连接配置 元组的两个方法: index, count >>> r = (1,1,2,3) &g ...

  6. 【.NET深呼吸】元组数据(Tuple)

    各位观众,大家好,欢迎收看由火星电视台直播的<老周吹牛>节目,注意:本节目没有任何技术含量,如果您没有兴趣,请砸掉电视机. 今天说一下System命名空间下的一个数据类型——Tuple,翻 ...

  7. python学习笔记(列表、元组、购物车实例)

    一.列表 列表和字典是最常用的两种数据类型 1. 需求:怎么存放班级80多人的姓名,如何实现? names = ["Zhangyang","Guyun",&qu ...

  8. python之最强王者(7)——元组(tuple)

    1.序列(sequence): 说明:在前面的字符串列表中其实我们已经用到了序列,之所以放到这篇来讲主要是为了承上启下,方便理解和记忆. python的数据访问模型:直接存取 ,序列 ,映射 对非容器 ...

  9. Python元组

    Python的元组与列表类似,不同之处在于元组的元素不能修改. 元组使用小括号,列表使用方括号. 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可. 如下实例: tup1 = ('physi ...

随机推荐

  1. 第十八节:详解Java抽象类和接口的区别

    前言 对于面向对象编程来说,抽象是它的特征之一. 在Java中,实现抽象的机制分两种,一为抽象类,二为接口. 抽象类为abstract class,接口为Interface. 今天来学习一下Java中 ...

  2. centos部署flask

    1.先安装uwsgi pip install uwsgi 2.在你的项目根目录下创建一个配置文件uwsgiconfig.ini(uwsgi支持多种配置文件格式,xml,ini,json等) [uwsg ...

  3. 一个隐蔽的C语言问题反思

    今天在编译一个C代码的时候,从别的编译ok的头文件中拷贝了一份在上面做修改,没想到修改好之后一直 无法调用这个头文件中的函数和变量.看了好久,才在预编译宏中找到了问题的根源.代码 如下所示: 头文件A ...

  4. Testing - 软件测试知识梳理 - 探索性测试

    定义 探索性测试(Exploratory Testing)是一种自由的软件测试风格,强调测试人员同时展开测试学习,测试设计,测试执行和测试结果评估等活动,以持续优化测试工作. 其特征有:即兴发挥,快速 ...

  5. Python Web Service

    搞移动端有段时间了,一直使用别人的API,自己也只写过ASP.NET网站作为网络服务,相对来讲是很大的短板.虽然ASP.NET可以提供想要的web服务,但是其体量臃肿,响应速度非常慢,这点我非常不喜欢 ...

  6. OC学习5——类和对象

    1.OC是在C语言基础上进行扩展得到的一门面向对象的程序设计语言,它也提供了定义类.成员变量和方法的基本功能.类可以被认为是一种自定义的数据类型,使用它可以定义变量,所有使用类定义的变量都是指针类型的 ...

  7. mysql之CREATE DATABASE Syntax(创建数据库)

    一:语法 CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name #SCHEMA是DATABASE的同义词 [IF NOT EXITTS]可防止建库是已经 ...

  8. jenkins 集成钉钉机器人通知

    公司使用钉钉做为公司内部的通讯工具,所以想通过Jenkins发布完成以后通过钉钉来通知大家,研究发现钉钉提供机器人,所以我把机器人集成进来通知相关人员. 1.创建通知人群组,添加机器人(钉钉默认自带了 ...

  9. app操作的一些命令

    这里的操作都是在windows下,在android SDK安装好之后就可以连接实体手机或者模拟器操作 1.查看连接的手机或者模拟器 adb devices 结果如下: 2.查看某个app的包名和act ...

  10. 第八章:四大组件之Content Provider

    前言 Content Provider——Android四大组件之一. 本文要点 1.Content Provider简介 2.URI简介 3.如何访问Content Provider中数据 一.Co ...