在 C# 中,如何使用 Switch 对非常量字符串值执行模式匹配?

Posted

技术标签:

【中文标题】在 C# 中,如何使用 Switch 对非常量字符串值执行模式匹配?【英文标题】:In C#, How To Perform Pattern Matching With Switch For Non-Constant String Value? 【发布时间】:2021-12-03 14:02:58 【问题描述】:

在 C# 中,如何使用 Switch 对非常量字符串值进行模式匹配?

我希望能够在 switch 语句中使用非常量字符串变量作为匹配目标。

我有下面的代码,但我在case expectedValue: 遇到错误CS0150: A constant value is expected

public bool UseStandardSwitch(string inputValue)

    var expectedValue = "SomeValue";

    bool result = default;
    var DoSomething = () =>  result = true; ;
            
    switch (inputValue)
    
        case expectedValue:
            DoSomething();
            break;
        default:
            break;
    
    return result;

有没有办法达到类似的效果?

【问题讨论】:

为什么要使用开关,对于一个简单的if 来说似乎是一项工作,不是吗? nvoigt,该代码并非旨在反映实际用例。目标是突出语法。 【参考方案1】:

无需引入变量(如您的回答)-您可以将 discard 与 case guard 一起使用:

public bool UseStandardSwitch(string inputValue)

    var expectedValue = Console.ReadLine()!;
    Func<bool> DoSomething = () => true;
    
    return inputValue switch
    
        _ when inputValue.Equals(expectedValue) => DoSomething(),
        _ when inputValue.Equals(expectedValue + "1") => DoSomething(),
        _ => throw new ArgumentException(),
    ;

【讨论】:

在哪个版本的 C# 上引入了这个? @Error404Brainnotfound 我相信从 C# 8 开始。 非常感谢!现在我知道我不能在我的项目中使用它:')【参考方案2】:

您可以使用the var pattern 来完成类似的事情。

试试这个:

public bool UsePatternMatching(string value)

    var DoSomething = () => true;

    return value switch
    
        var str when str.Equals("SomeValue") => DoSomething(),
        _ => throw new ArgumentException(),
    ;

更新:请参阅 Stron 的帖子以获得改进的答案。

【讨论】:

这不是switch,不过...这是伪装成switch 的if-else。它还需要为“switch”的每个分支声明一个新的变量,这是低效的。 希望读者能够幸运地处理变量声明对性能开销有重要影响的代码:) 我同意这不太可能是一个问题,但最好准确地解释幕后所做的事情,以便让读者为他们的用例做出最合适的决定。现在添加到 C# 中的许多语法糖都隐藏了很多复杂性。

以上是关于在 C# 中,如何使用 Switch 对非常量字符串值执行模式匹配?的主要内容,如果未能解决你的问题,请参考以下文章

在 Switch 案例中标记字符串

如何在 const 成员函数中使用非常量成员函数?

C语言如何实现两个非常量的CHAR字符串连接

如何在 C# 中对字符串进行 URL 编码

如何在 C# 中对二维(矩形)数组进行排序?

如何在json单引号中写入c#字符串