C#中如何在switch语句内使用Contains()方法实现字符串包含匹配
C# Switch结合Contains实现字符串包含判断的可行方案
原有代码的问题
Contains()方法必须传入要检索的目标字符串参数,原代码括号为空无法通过编译Contains()方法返回值是bool类型,并非字符串,原代码中Switch传入布尔值却匹配字符串类型的Case,类型完全不兼容,无法正常运行- 没有对入参
text做非空校验,当text为null时直接调用ToLower()会抛出空引用异常
通用兼容实现(支持所有C#版本)
通过Switch固定匹配true值 + Case守卫条件的方式实现自定义包含判断,完全替代多段else if结构,符合使用Switch语句的需求:
public void Read(string text) { // 入参非空保护,避免空引用异常 if (string.IsNullOrWhiteSpace(text)) return; switch (true) { // 每个分支对应一个关键词的包含判断 case true when text.Contains("read", StringComparison.OrdinalIgnoreCase): MessageBox.Show(text); break; case true when text.Contains("not", StringComparison.OrdinalIgnoreCase): MessageBox.Show(text); break; // 可直接扩展其他关键词分支 default: // 未匹配任何关键词的处理逻辑 break; } }
实现说明
- 使用
Contains的重载方法传入StringComparison.OrdinalIgnoreCase,可直接实现不区分大小写的匹配,无需提前调用ToLower()转换,性能更优 - 多关键词同时命中时,会按分支的书写顺序匹配第一个符合条件的分支,逻辑优先级和
else if完全一致 - 若需要调整某类匹配的优先级,仅需将对应分支代码移动到更靠前的位置即可
高版本C#简化实现(C# 8及以上)
可使用更简洁的Switch表达式实现相同逻辑:
public void Read(string text) { if (string.IsNullOrWhiteSpace(text)) return; _ = text switch { _ when text.Contains("read", StringComparison.OrdinalIgnoreCase) => MessageBox.Show(text), _ when text.Contains("not", StringComparison.OrdinalIgnoreCase) => MessageBox.Show(text), _ => null }; }
内容的提问来源于stack exchange,提问作者Axyclez
相关产品推荐
相关产品推荐

