首页 > 编程语言 >C# 模式匹配

C# 模式匹配

时间:2024-07-18 17:32:04浏览次数:20  
标签:Console C# grade Grade num WriteLine data 模式匹配

C# 使用模式匹配的好处,因为好用所以推荐~ - 万雅虎 - 博客园 (cnblogs.com) 具体可以看这篇文章 我主要是写一下自己的看法

1.Object类型转换

以往的Object类型转换都是比较麻烦的 ,比如

            object obj = "20";
            var num = (int)obj;
            Console.WriteLine(num);

上述代码会报错,而且在强类型语言里都用上Object,基本代表你这个对象肯定不止一种类型

那么有模式匹配后,你就可以这么写

            object obj = "20";
            if (obj is string s)
            {
                Console.WriteLine(s);
            }
            else if (obj is int num)
            {
                Console.WriteLine(num);
            }

或者用switch模式

            switch (obj)
            {
                case 0:
                    Console.WriteLine("数字 0");
                    break;
                case int num:
                    Console.WriteLine($"数字 {num}");
                    break;
                case string value:
                    Console.WriteLine($"字符串 {value}");
                    break;
            }

2.对象的属性进行模式匹配

开发中 我们经常会判断对象是否null 写法如下

            CheckListTagRelation data = null;//模拟方法返回这个对象 
            if (data != null && data.IsDelete == false && data.Grade == 4)
            {
                //操作
            }

代码量还挺多的,下面是对象的属性进行模式匹配写法,连null都给你隐式判断了

            if(data is { IsDelete: false, Grade: 4 })
            {
                //操作
            }

Null判断

            decimal? num = 2;
            if (num != null)
            {
                Console.WriteLine(num);
            }
            if (num is not null) 
            {
                //这样写和上面相比好处是 即使重载!=的运算 也不会影响
                Console.WriteLine(num);
            }

3.逻辑模式

            if (data != null &&( (data.Grade > 2&&data.Grade<10)||data.Grade<0))
            {
                //操作
            }
            if (data is { Grade: (> 6 and < 10) or < 0 })
            {
                //操作
            }

同样先判断非Null 然后再判断 (Grade大于2与Grade<10)或者Grade<0  后面的写法看起来就简单多了

4.关系模式

这是一个传入成绩 ,返回评分的写法,传统的方式是这样

string GetOldGrade(int grade)
{
    if (grade < 60)
    {
        return "不及格";
    }
    else if (grade < 70)
    {
        return "勉强及格";
    }
    else if (grade < 80)
    {
        return "良好";
    }
    else if (grade < 90)
    {
        return "优秀";
    }
    else if (grade < 100)
    {
        return "卓越";
    }
    else
    {
        return "天才";
    }
}

用了关系匹配后,代码量暴减

            string GetGrade(int grade) =>
                grade switch
                {
                    < 60 => "不及格",
                    < 70 => "勉强及格",
                    >= 70 and < 80 => "良好", //与写法<80效果一样 只是展示逻辑模式
                    < 90 => "优秀",
                    < 100 => "卓越",
                    _ => "天才",
                };

如果是对象,还可以这样写

            string GetGradeByClass(CheckListTagRelation data) =>
                data switch
                {
                    { IsDelete: false, Grade: < 60 } => "不及格",
                    { IsDelete: false, Grade: < 70 } => "勉强及格",
                    { IsDelete: false, Grade: >= 70 and < 80 } => "良好",
                    { IsDelete: false, Grade: < 90 } => "优秀",
                    { IsDelete: false, Grade: < 100 } => "卓越",
                    null=>"错误",
                    _ => "天才",
                };

 

标签:Console,C#,grade,Grade,num,WriteLine,data,模式匹配
From: https://www.cnblogs.com/czb071/p/18309738

相关文章

  • 2024-07-18 code标签渲染时会多出空格是怎么回事?
    问题就是我给code标签传递一段源代码,该代码明明没有空格,但实际渲染却多了一串空格?如下图所示: 原因:code标签包裹的内容会原原本本的渲染出来,包括空格。我查看了我的代码: 我是这么写的:<code>{{sourceCode}}</code>{{sourceCode}}前面有空格,code标签直接把它们......
  • ETL数据集成丨通过ETLCloud工具,将Oracle数据实时同步至Doris中
    ETLCloud是一个全面的数据集成平台,专注于解决大数据量和高合规要求环境下的数据集成需求。采用先进的技术架构,如微服务和全Web可视化的集成设计,为用户提供了一站式的数据处理解决方案。主要特点和功能包括:实时数据处理:强调实时数据集成能力,这对于需要即时数据分析和决策支持的......
  • 【比赛】暑假集训CSP提高模拟1
    T1Start10Pts题面(较长)大模拟。点击查看代码#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintinf=INT_MAX;stringnm[10]={"","D","B","A","C","E","PASS","......
  • 【YOLOv8改进 - 注意力机制】GC Block: 全局上下文块,高效捕获特征图中的全局依赖关系
    YOLOv8目标检测创新改进与实战案例专栏专栏目录:YOLOv8有效改进系列及项目实战目录包含卷积,主干注意力,检测头等创新机制以及各种目标检测分割项目实战案例专栏链接:YOLOv8基础解析+创新改进+实战案例介绍摘要非局部网络(NLNet)通过聚合特定查询位置的全局上下......
  • 【YOLOv8改进 - 特征融合NECK】SDI:多层次特征融合模块,替换contact操作
    YOLOv8目标检测创新改进与实战案例专栏专栏目录:YOLOv8有效改进系列及项目实战目录包含卷积,主干注意力,检测头等创新机制以及各种目标检测分割项目实战案例专栏链接:YOLOv8基础解析+创新改进+实战案例介绍摘要在本文中,我们介绍了U-Netv2,一种用于医学图像分割......
  • Docker--harbor 私有仓库部署与管理
    一、Harbor简介1.Harbor概念Harbor是VMware公司开源的企业级DockerRegistry项目,其目标是帮助用户迅速搭建一个企业级的DockerRegistry服务。Harbor以Docker公司开源的Registry为基础,提供了图形管理UI、基于角色的访问控制(RoleBasedAccessControl)、AD/......
  • (7-2-03)RRT算法:RRT算法的定义与实现(3)RRT_Connect 算法
    7.2.4 RRT_Connect算法RRT-Connect算法是RRT(Rapidly-exploringRandomTree)算法的一种变体,用于解决路径规划问题。与标准的RRT算法不同,RRT-Connect算法旨在通过两个相互连接的RRT树来更快地找到起始点和目标点之间的路径。上述的RRT每次搜索都只有从初始状态点生......
  • 【Docker】基于Docker-compose创建LNMP环境
    目录一.Docker-compose概述1.容器编排管理与传统的容器管理的区别2.docker-compose作用3.docker-compose本质4.docker-compose的三大概念二.YML文件格式及编写注意事项1.yml文件是什么2.yml问价使用注意事项3.yml文件的基本数据结构三.Docker-compose配置1.Doc......
  • ComfyUI进阶:Comfyroll插件 (三)
    前言:学习ComfyUI是一场持久战,而Comfyroll是一款功能强大的自定义节点集合,专为ComfyUI用户打造,旨在提供更加丰富和专业的图像生成与编辑工具。借助这些节点,用户可以在静态图像的精细调整和动态动画的复杂构建方面进行深入探索。Comfyroll的节点设计简洁易用,功能强大,是每个......
  • ComfyUI进阶:Comfyroll插件 (四)
    前言:学习ComfyUI是一场持久战,而Comfyroll是一款功能强大的自定义节点集合,专为ComfyUI用户打造,旨在提供更加丰富和专业的图像生成与编辑工具。借助这些节点,用户可以在静态图像的精细调整和动态动画的复杂构建方面进行深入探索。Comfyroll的节点设计简洁易用,功能强大,是每个......