递归模式结合record可自然匹配树结构,如用{ Left: null, Right: null }判断叶子节点,或嵌套模式识别子树形状,还可用于表达式树求值与简化,如Add(var e, Constant(0))映射为Simplify(e),实现声明式结构解析。

在 C# 中,模式匹配的递归模式(recursive patterns)可以自然地用来匹配树结构。通过结合 递归数据类型 和 位置模式(positional patterns),你可以清晰地解构并判断节点结构、字段值或嵌套关系。
以二叉树为例,每个节点包含一个值和左右子节点:
public record TreeNode(int Value, TreeNode? Left, TreeNode? Right);这是一个典型的不可变树结构,使用 record 支持基于值的相等性和位置解构,这是实现递归模式匹配的基础。
你可以用 switch 表达式 或 is 表达式 来匹配树的形状。例如,判断是否为叶子节点(无子节点):
bool IsLeaf(TreeNode? node) => node is { Left: null, Right: null };更复杂的结构可以用嵌套的位置模式。比如判断一个节点左子是叶子节点:
bool HasLeftLeaf(TreeNode? node) => node is { Left: { Left: null, Right: null } };你也可以结合常量和范围模式。例如,匹配某个特定形状的子树:
string Classify(TreeNode? node) => node switch { null => "Empty", { Value: 0, Left: null, Right: null } => "Zero leaf", { Value: var v, Left: { Value: var lv }, Right: null } when v > lv => "Right unbalanced", { Value: _, Left: not null, Right: not null } => "Full node", _ => "Other" };递归模式特别适合用于表达式树的分析。比如定义一个简单的算术表达式树:
public abstract record Expr; public record Constant(int Value) : Expr; public record Add(Expr Left, Expr Right) : Expr; public record Multiply(Expr Left, Expr Right) : Expr;然后你可以用模式匹配来“解释”或优化表达式:
int Evaluate(Expr expr) => expr switch { Constant(int value) => value, Add(var left, var right) => Evaluate(left) + Evaluate(right), Multiply(var left, var right) => Evaluate(left) * Evaluate(right), _ => throw new NotSupportedException() };还可以做代数简化,比如识别 x + 0 这样的模式:
基本上就这些。递归模式让 C# 能以声明式方式处理复杂嵌套结构,尤其适合语法树、配置树或领域模型的条件判断与转换。关键是使用 record 提供的解构能力和模式中的嵌套匹配逻辑。不复杂但容易忽略的是:确保属性或位置可被编译器静态分析,否则模式无法生效。
以上就是C# 中的模式匹配递归模式如何匹配树结构?的详细内容,更多请关注php中文网其它相关文章!
 
                        
                        每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
 
                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号