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");
...
考虑以下几点:
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");
...