C#怎么使用list patterns C# 11列表模式匹配详解

8次阅读

C# 11 的列表模式支持对数组、IReadOnlyList 等序列类型进行结构化匹配。它引入位置匹配(如[1,2,3])、通配符_和切片模式。.,可结合变量绑定与类型检查,适用于命令行解析、路由匹配等场景。

C# 怎么使用 list patterns C# 11 列表模式匹配详解

C# 11 引入的 列表模式(List Patterns) 是对模式匹配能力的重要增强,它让你能更自然、更安全地解构数组、只读集合(如 IReadOnlyList)、Span 等支持索引和长度的序列类型,而不仅限于固定长度的元组或对象。

什么是列表模式?

列表模式允许你在 switch 表达式或 is 检查中,用类似数组字面量的语法来匹配序列结构。核心是三个新语法元素:

  • 位置匹配:如 [1, 2, 3] 匹配长度为 3 且各元素值严格相等的序列
  • 通配符 _:跳过某个位置的值,不绑定变量
  • 切片模式 ..:匹配任意长度的子序列(零个或多个元素),可放在开头、中间或结尾

基础用法:匹配常见结构

假设你有一个整数数组:

int[] numbers = [1, 2, 3, 4, 5];

你可以这样写模式匹配:

  • numbers is [1, _, _, _, 5]true(首尾固定,中间任意)
  • numbers is [1, .., 5]true(开头是 1,结尾是 5,中间任意长度)
  • numbers is [.., 4, 5]true(末尾两个是 4 和 5)
  • numbers is [1, 2, ..]true(前两个是 1 和 2,后面不管多少都行)
  • numbers is [..rest]true,且 rest 绑定为整个数组(类型是 int[]

结合变量绑定与类型检查

列表模式支持在匹配同时提取值并声明变量,甚至做类型转换:

  • if (obj is int[] [1, var x, ..]) → 匹配以 1 开头、第二个元素赋给 x、后面任意的 int[]
  • if (list is IList [..first, "done"]) → 匹配以 "done" 结尾的字符串列表,first 是除最后一个外的所有元素(类型为 IList
  • 注意:.. 左右不能同时省略变量名,即 [..] 合法(匹配任意序列),但 [..x..] 不合法

实际应用场景举例

列表模式特别适合处理有结构约定的数据序列:

  • 解析命令行参数:判断 args 是否为 ["build", "--target", var target]["run", ..]
  • HTTP 路由 匹配:把路径段 segments is ["api", "users", var id] 提取用户 ID
  • 协议帧解析:如 WebSocket 帧头 bytes is [0x81, ..payload] 判断是否为文本帧并提取负载
  • 避免手动 .Length 和索引检查,让代码更声明式、更少出错

基本上就这些。列表模式不是万能的(不支持非索引集合如 HashSet),但它让 C# 对“序列结构”的表达力上了一个台阶,配合 switch 表达式,写出的逻辑更清晰、更健壮。

星耀云
版权声明:本站原创文章,由 星耀云 2025-12-25发表,共计1128字。
转载说明:转载本网站任何内容,请按照转载方式正确书写本站原文地址。本站提供的一切软件、教程和内容信息仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。
text=ZqhQzanResources