递归模式匹配结合位置析构实现树形数据变换
利用C# 9+的递归模式与位置模式析构,一行代码完成复杂树结构的查询与变换。 · 难度:入门 · +10XP
递归模式与析构变换
传统方式处理树形数据(如JSON AST、表达式树)需要大量嵌套if和递归。本教程展示如何将位置模式(Positional Pattern)与递归模式结合,在switch表达式中直接匹配树节点结构并进行变换。例如对数学表达式进行符号求导,或对XML节点进行过滤。通过模式嵌套和when子句,代码简洁且类型安全,同时编译器帮忙检查穷尽性。
public abstract record Expr;
public record Constant(int Value) : Expr;
public record Add(Expr Left, Expr Right) : Expr;
public record Mul(Expr Left, Expr Right) : Expr;
static string Simplify(Expr e) => e switch
{
Constant(0) => "0",
Constant(var v) => v.ToString(),
Add(Constant(0), var right) => Simplify(right),
Add(var left, var right) => $"({Simplify(left)}+{Simplify(right)})",
Mul(Constant(0), _) => "0",
Mul(_, Constant(0)) => "0",
Mul(var left, var right) => $"({Simplify(left)}*{Simplify(right)})",
_ => "?"
};