当前位置: 首页 > news >正文

C#教程 - 模式匹配(Pattern matching)

更新记录
转载请注明出处:
2022年9月25日 发布。
2022年9月10日 从笔记迁移到博客。

常见匹配模式

类型匹配模式(type pattern)

属性匹配模式(property pattern)

匹配模式可以放在多种上下文中:

After the is operator (variable is pattern)

In switch statements

In switch expressions

类型匹配模式(type pattern)

实例:is类型匹配

if (obj is string s)
 Console.WriteLine (s.Length);

属性匹配模式(property pattern)

注意:从C# 7/8开始引入

实例:属性匹配

if (obj is string { Length:4 })
{
    //as same
    // if (obj is string s && s.Length == 4)
    Console.WriteLine ("A string with 4 characters");
}

实例:属性匹配

bool ShouldAllow (Uri uri) => uri switch
{
    { Scheme: "http", Port: 80 } => true,
    { Scheme: "https", Port: 443 } => true,
    { Scheme: "ftp", Port: 21 } => true,
    { IsLoopback: true } => true,
    _ => false
};

实例:

{ Scheme: string { Length: 4 }, Port: 80 } => true,
{ Scheme: "http", Port: 80 } when uri.Host.Length < 1000 => true,

实例:

bool ShouldAllow (object uri) => uri switch
{
    Uri { Scheme: "http", Port: 80 } => true,
    Uri { Scheme: "https", Port: 443 } => true,
}

元组匹配模式(Tuple Patterns)

注意:从C# 8开始支持

实例:

int AverageCelsiusTemperature (Season season, bool daytime) => (season, daytime) switch{
    (Season.Spring, true) => 20,
    (Season.Spring, false) => 16,
    (Season.Summer, true) => 27,
    (Season.Summer, false) => 22,
    (Season.Fall, true) => 18,
    (Season.Fall, false) => 12,
    (Season.Winter, true) => 10,
    (Season.Winter, false) => -2,
    _ => throw new Exception ("Unexpected combination")
};

位置匹配(Positional Patterns)

实例:

//测试使用的类型
class Point
{
    public readonly int X, Y;
    public Point (int x, int y) => (X, Y) = (x, y);
    //定义解构器
    public void Deconstruct (out int x, out int y)
    {
        x = X; y = Y;
    }
}
var p = new Point (2, 3);
//使用位置匹配模式
Console.WriteLine (p is (2, 3)); // true

//还可以在switch中使用位置匹配模式
string Print (object obj) => obj switch
{
    Point (0, 0) => "Empty point",
    Point (var x, var y) when x == y => "Diagonal"
    //...
};

var匹配(var Pattern)

注意:从C# 7开始支持

实例:

bool Test (int x, int y) =>
         x * y is var product && product > 10 && product < 100;

常量匹配(Constant Pattern)

可以将常量或字面量作为匹配

实例:

void Foo (object obj)
{
    // C# won't let you use the == operator, because obj is object.
    // However, we can use 'is'
    if (obj is 3) //...
    //as same
    //if (obj is int && (int)obj == 3) ...
}

相关文章:

  • 动手学习深度学习 05:深度学习计算
  • 状体模式-优雅解决物流状态
  • CTF之加密解密训练
  • gnome-terminal用法解析
  • ceres优化库的使用
  • TypeScript基础教程
  • docker安装Jenkins配置cicd
  • MQTT android配置
  • wPDF v5支持并改进旋转文本的逻辑
  • <Linux复习>基本指令及重要热键
  • html扩展名命名规范
  • docker学习-入门篇
  • 按位与最大的最长连续子数组
  • <Linux复习>基础指令下
  • Spring中自定义依赖注入对象注入Controller中,优雅的解决用户鉴权问题(HandlerInterceptorAdapter)
  • 《Java编程思想》读书笔记-对象导论
  • 10个最佳ES6特性 ES7与ES8的特性
  • C语言笔记(第一章:C语言编程)
  • Flannel解读
  • javascript 总结(常用工具类的封装)
  • JS题目及答案整理
  • leetcode98. Validate Binary Search Tree
  • Median of Two Sorted Arrays
  • rabbitmq延迟消息示例
  • React-Native - 收藏集 - 掘金
  • 从0实现一个tiny react(三)生命周期
  • 二维平面内的碰撞检测【一】
  • 复习Javascript专题(四):js中的深浅拷贝
  • 我的面试准备过程--容器(更新中)
  • UI设计初学者应该如何入门?
  • 说说我为什么看好Spring Cloud Alibaba
  • (2)Java 简介
  • (4) PIVOT 和 UPIVOT 的使用
  • (4)(4.6) Triducer
  • (70min)字节暑假实习二面(已挂)
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (Matlab)使用竞争神经网络实现数据聚类
  • (翻译)terry crowley: 写给程序员
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (三分钟)速览传统边缘检测算子
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • *** 2003
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈
  • .NET4.0并行计算技术基础(1)
  • .NET分布式缓存Memcached从入门到实战
  • .net和php怎么连接,php和apache之间如何连接
  • .NET正则基础之——正则委托
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!