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

C# 模式匹配

时间:2024-06-18 18:13:45浏览次数:24  
标签:case Console C# int WriteLine return 模式匹配

C# 模式匹配

patternmatching

https://www.geeksforgeeks.org/pattern-matching-in-c-sharp/

https://www.codeproject.com/Articles/5368148/Your-Quick-Guide-to-Pattern-Matching-in-Csharp

什是模式匹配

模式匹配是一种在代码中识别和提取数据的机制。它允许您以声明式的方式检查对象的形状,而无需编写冗长的条件语句。

模式匹配的优势

  • Type-Testing 类型测试
  • Nullable-type checking 可空类型检查
  • Type casting and assignment 类型转换和分配
  • High readability 可读性高
  • Concise syntax 简洁的语法
  • Less convoluted code 代码更简洁

模式匹配的主要特性包括

  1. 类型模式:检查对象是否属于特定的类型。
  2. 属性模式:检查对象是否具有特定的属性。
  3. 位置模式:检查对象的具体结构。
  4. var 模式:将匹配的值存储在变量中以供后续使用。
  5. 恒定模式 :与常量值进行测试,常量值可以包括 intfloatcharstringbool、,用constnull声明的字段。
  6. 弃元模式:与 discard 运算符_的模式匹配,匹配任何内容,包括 null,它的用法在新的开关表达式中大放异彩,以匹配默认或否则情况。
  7. 元组模式:从位置模式的特殊派生,您可以在其中测试同一表达式中类型的多个属性。
  8. 列表模式:列表匹配模式是 C# 中模式匹配的最新补充,使用列表模式,您可以将列表或数组与一组顺序元素进行匹配。

模式匹配的主要应用场景

  1. 类型判断和转换:
    • 替代传统的 isas 操作符,提供更简洁的语法。
    • switch 语句中进行类型匹配。
  2. 属性检查:
    • 检查对象是否具有某些属性,并基于属性值采取不同的操作。
    • if 语句中进行属性模式匹配。
  3. 数据解构:
    • 对元组、记录类型等复杂数据结构进行解构,提取感兴趣的部分。
    • var 模式中使用位置模式匹配。
  4. 列表和数组处理:
    • 使用模式匹配检查列表或数组的长度和元素位置。
    • switch 语句中对列表进行模式匹配。
  5. 错误处理:
    • try-catch 语句中使用模式匹配捕获特定类型的异常。
    • switch 语句中对异常类型进行模式匹配。
  6. 领域驱动设计:
    • 使用模式匹配表达领域概念,提高代码的可读性和可维护性。
    • 在领域模型中使用模式匹配进行数据验证和转换。

示例

  1. 类型判断和转换:

    object obj = "Hello, world!";
    if (obj is string s)
    {
        Console.WriteLine(s.ToUpper()); // 输出: HELLO, WORLD!
    }
    
    switch (obj)
    {
        case string s:
            Console.WriteLine($"It's a string: {s}");
            break;
        case int i:
            Console.WriteLine($"It's an integer: {i}");
            break;
        default:
            Console.WriteLine("It's something else");
            break;
    }
    
  2. 属性检查:

    var person = new { Name = "Alice", Age = 30 };
    if (person is { Age: >= 18 })
    {
        Console.WriteLine($"{person.Name} is an adult.");
    }
    
  3. 数据解构:

    var point = (10, 20);
    if (point is (int x, int y))
    {
        Console.WriteLine($"X: {x}, Y: {y}");
    }
    
    var list = new List<int> { 1, 2, 3, 4, 5 };
    if (list is [_, _, int middle, _, _])
    {
        Console.WriteLine($"The middle element is: {middle}");
    }
    
  4. 列表和数组处理:

    var numbers = new List<int> { 1, 2, 3, 4, 5 };
    switch (numbers)
    {
        case []:
            Console.WriteLine("The list is empty.");
            break;
        case [int first]:
            Console.WriteLine($"The list has one element: {first}");
            break;
        case [int first, int second]:
            Console.WriteLine($"The list has two elements: {first}, {second}");
            break;
        case var all:
            Console.WriteLine($"The list has {all.Count} elements.");
            break;
    }
    
  5. 错误处理:

    try
    {
        // 某些可能引发异常的操作
    }
    catch (DivideByZeroException ex)
    {
        Console.WriteLine($"Caught DivideByZeroException: {ex.Message}");
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Caught general Exception: {ex.Message}");
    }
    
    
  6. 领域驱动设计:

    public record Person(string Name, int Age);
    
    var person = new Person("Alice", 30);
    if (person is { Age: >= 18 })
    {
        Console.WriteLine($"{person.Name} is an adult.");
    }
    
  7. 恒定模式:

    public bool IsFreshProduce(FoodModel food)
    {
        return food?.Category?.ID is (int)  ProductCategoryEnum.FreshProduce;
    }
    
  8. 弃元模式:

    //如果未提供食物的储存温度或数字与以下范围不匹配,则将引发自定义异常
    public int GetFoodStorageTemperature
           (StorageRequirementEnum storageRequirement) => storageRequirement switch
    {
        StorageRequirementEnum.Freezer => -18,
        StorageRequirementEnum.Refrigerator => 4,
        StorageRequirementEnum.RoomTemperature => 25,
        _ => throw new InvalidStorageRequirementException()
    };
    
    // switch (storageRequirement)
            // {
            //     case StorageRequirementEnum.Freezer:
            //         return -18;
            //     case StorageRequirementEnum.Refrigerator:
            //         return 4;
            //     case StorageRequirementEnum.RoomTemperature:
            //         return 25;
            //     default:
            //         throw new Exception();
            // }
    
  9. 元组模式:

    //转基因食品检测
    public string GetFoodDescription(FoodModel food) => (food.NonGMO, food.Category.ID) switch
    {
     (true, (int)ProductCategoryEnum.FreshProduce) => "Non-GMO Fresh Product",
     (true, (int)ProductCategoryEnum.Dairy) => "Non-GMO Dairy",
     (false, (int)ProductCategoryEnum.Meats) => "GMO Meats. Avoid!",
     (_, _) => "Invalid Food Group"
    };
    // switch (food.NonGMO, food.Category.ID)
    // {
    //     case (true, (int)ProductCategoryEnum.FreshProduce):
    //         return "Non-GMO Fresh Product";
    //     case (true, (int)ProductCategoryEnum.Dairy):
    //         return "Non-GMO Dairy";
    //     case (false, (int)ProductCategoryEnum.Meats):
    //         return "GMO Meats. Avoid!";
    //     default:
    //         return "Invalid Food Group";
    // }
    
    
  10. 列表模式:

public (int?, int?) FindNumberOneAndNumberFour()
{
   int[] numbers = { 1, 2, 3, 4, 5 };
   // Match if 2nd value is anything, 3rd is greater than or equal 3, fifth is 5
   if (numbers is [var numberOne, _, >= 3, int numberFour, 5])
   {
       return (numberOne, numberFour);
   }
   return (null, null);
}

这些案例展示了模式匹配在各种场景下的应用,包括类型判断、属性检查、数据解构、列表处理、错误处理以及领域建模等。通过使用模式匹配,您可以编写更简洁、可读性更强的代码,同时也能在某些情况下提高性能。熟练掌握这些模式匹配的使用技巧,将有助于您提高代码质量和开发效率。

获得永久免费的无限 GPT 查询次数,点击链接并下载Monica插件,即可参加限时活动。
https://monica.im/invitation?c=OWBJ2ZBE

标签:case,Console,C#,int,WriteLine,return,模式匹配
From: https://www.cnblogs.com/Firepad-magic/p/18254862

相关文章

  • JavaScript 的Blob 对象详解
    JavaScript的Blob对象详解:https://blog.csdn.net/qq_41152573/article/details/136225387?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171870454816800227415776%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=17187045481680......
  • 详谈JavaScript 二进制家族:Blob、File、FileReader、ArrayBuffer、Base64
    详谈JavaScript二进制家族:Blob、File、FileReader、ArrayBuffer、Base64:https://blog.csdn.net/weixin_43025151/article/details/129743443?ops_request_misc=&request_id=&biz_id=102&utm_term=JavaScript%E4%B8%AD%E7%9A%84Blob%E4%BD%A0%E7%9F%A5%E9%81%93%E5%A4%9A%E......
  • nginx四层+七层分享代理实现与tomcat多实例动静分离
     实验架构图如下,最终实现负载均衡和动静分离:一、Tomcat多实例1.配置思路1)修改tomcat主配置文件server.xml中的三个端口号808080058009;2)修改tomcat启动停止脚本startup.shshutdown.sh,添加exportCATALINABASECATALINAHONETOWCATHOME变量都指向实例的工作......
  • win——win安装curl
    参考原文链接:https://blog.csdn.net/weixin_45191386/article/details/1306528211、Curl简介curl命令网络应用curl命令是一个利用URL规则在命令行下工作的文件传输工具。CURL支持的通信协议有FTP、FTPS、HTTP、HTTPS、TFTP、SFTP、Gopher、SCP、Telnet、DICT、FILE、LDAP、LDAP......
  • Win11+Miniconda3+python3.9安装pyspark+pytorch
    Win11+Miniconda3+python3.9安装pyspark+pytorch步骤1:安装Miniconda3,具体可以百度或者google步骤2:安装好Miniconda3之后,要创建虚拟环境,类似于虚拟机的样子,然后在虚拟环境安装各种python包已经装好了pytorch,具体步骤可以参考网上的一些教程,很多时候要综合多个教程,比如说先建立......
  • win——cmd窗口下执行jar包 logger.info输出乱码
    1、问题描述执行jar包,在cmd窗口中执行jar包,看到输出中,logger.info的输出为乱码,而System.out.println()输出为正确的日志。2、问题处理2.1、窗口设置因为cmd默认的编码为GBK,jar包一般设置为UTF-8;在cmd窗口先输入:chcp65001(注意之间有空格)然后执行jar包命令:java-jar-Dfil......
  • react 自定义鼠标右键点击事件
    功能:鼠标右键点击节点时,出现“复制”功能,点击其他部位,隐藏“复制”;鼠标右键事件的文案,始终在鼠标点击位置的右下方;点击复制,提示复制成功效果图:代码:const[showRight,setShowRight]=useState(false);constcontextMenu=useRef(null);const[clickX,setClickX]=us......
  • 【文末附gpt升级秘笈】SDCon 2024全球软件研发技术大会:引领AI 2.0时代的软件开发新篇
    SDCon2024全球软件研发技术大会:引领AI2.0时代的软件开发新篇章一、引言随着人工智能技术的飞速发展,我们迎来了AI2.0时代。在这个时代,人工智能技术不仅深刻影响着我们的日常生活,更在软件研发领域掀起了一场革命。AI原生应用的出现,使得每行代码、每个应用都有可能迎来被智能......
  • Centos7升级K8S集群
    Centos7升级K8S集群适用于使用kubeadm部署的k8s环境。Kubernetes版本以x.y.z表示,其中x是主要版本,y是次要版本,z是补丁版本。升级时不可以跳过次版本。例如,你只能从1.y升级到1.y+1,而不能从1.y升级到1.y+2。版本偏差说明:https://kubernetes.io/zh-cn/relea......
  • 论文阅读:Improved Graph Contrastive Learning for Short Text Classification
    LiuY,HuangL,GiunchigliaF,etal.Improvedgraphcontrastivelearningforshorttextclassification[C]//ProceedingsoftheAAAIConferenceonArtificialIntelligence.2024,38(17):18716-18724.GIFT模型的github网址整体框架图首先,构建一个由Gw、Ge和Gp三......