C# switch 表达式/模式匹配 - when 子句里面 or

C# switch expression / pattern matching - when clause inside or

考虑以下几点:

var ch = 'i';
var str = "some item";

var result = ch switch
            {
                'a' => DoA("some", "parameters"),
                _ when str.Contains("action a") => DoA("some", "parameters"),
                'b' => DoB("some", "parameters"),
                _ when str.Contains("action b") => DoB("some", "parameters"),
                'c' => DoC(),
                _ when str.Contains("action c") => DoC("some", "parameters"),
                _ => new Exception("")
            };

现在你可以在调用方法时看到重复,所以理想情况下我想要这样的东西:

var result = ch switch
            {
                'a' or (_ when str.Contains("action a")) => DoA("some", "parameters"),
                'b' or (_ when str.Contains("action b")) => DoB("some", "parameters"),
                'c' or (_ when str.Contains("action c")) => DoC("some", "parameters"),
                _ => new Exception("")
            };

但这让我犯了语法错误。
删除括号确实可以编译,但是逻辑等同于
('a' or _) when str.Contains("action a")) => DoA("some", "parameters") 这不是我想要的。

有没有办法做到正确而不重复?

你可以使用

var result = ch switch
{
   _ when ch == 'a' || str.Contains("action a") => ...

注意 : 我个人不喜欢这种类型转换表达式,有点丑陋

或者另一种选择就是用老式的方法创建一个方法¯\_(ツ)_/¯

public Bob DoSomething(char ch)
{
   if(ch =='a' || str.Contains("action a"))
       return DoA("some", "parameters");
   ...