如何用C#实现类似F# Active Pattern的功能?求更优方案
更简洁的C#等价实现替代F# Active Pattern
你可以通过单一函数返回枚举类型的方式,模拟F# Active Pattern的逻辑,避免冗余的多个判断函数,实现和F#版本一致的简洁性:
首先定义一个表示奇偶性的枚举:
public enum Parity { Even, Odd }
然后编写一个封装判断逻辑的函数,对应F#里的Active Pattern函数:
private static Parity GetParity(int number) => number % 2 == 0 ? Parity.Even : Parity.Odd;
最后实现TestNumber函数,利用switch表达式结合上述函数完成匹配:
string TestNumber(object n) { if (n is not int x) return $"{n} is Others"; return GetParity(x) switch { Parity.Even => $"{x} is Even", Parity.Odd => $"{x} is Odd", _ => $"{x} is Others" }; } // 调用示例 var result = TestNumber(7); // 输出 "7 is Odd"
优化说明
- 这个实现只用到一个判断函数
GetParity,和F#的Active Pattern一样,把奇偶判断的逻辑统一封装,避免了原C#版本中两个独立判断函数的冗余。 - 先做类型检查再处理,让代码逻辑更清晰,也减少了switch里的重复类型匹配。
如果追求极致紧凑,也可以把判断逻辑内联到switch中,但提取成独立函数的方式更符合F# Active Pattern的封装思想,可读性和可维护性更好。
内容的提问来源于stack exchange,提问作者Rm558
相关产品推荐
相关产品推荐

