【发布时间】:2019-11-02 16:48:54
【问题描述】:
如何编写 switch 表达式来支持返回相同结果的多种情况?
对于版本 8 之前的 C#,开关可以这样编写:
var switchValue = 3;
var resultText = string.Empty;
switch (switchValue)
{
case 1:
case 2:
case 3:
resultText = "one to three";
break;
case 4:
resultText = "four";
break;
case 5:
resultText = "five";
break;
default:
resultText = "unkown";
break;
}
当我使用 C# 版本 8 时,使用表达式语法时,是这样的:
var switchValue = 3;
var resultText = switchValue switch
{
1 => "one to three",
2 => "one to three",
3 => "one to three",
4 => "four",
5 => "five",
_ => "unknown",
};
所以我的问题是:如何将案例 1、2 和 3 变成只有一个 switch-case-arm,这样该值就不需要重复了?
根据“Rufus L”的建议更新:
对于我给出的示例,这是可行的。
var switchValue = 3;
var resultText = switchValue switch
{
var x when (x >= 1 && x <= 3) => "one to three",
4 => "four",
5 => "five",
_ => "unknown",
};
但这并不是我想要完成的。这仍然只是一种情况(带有过滤条件),而不是多种情况产生相同的右手结果。
【问题讨论】:
-
您想要完成什么? switch 表达式不是 switch 语句,并且明确禁止失败。
when无论如何都比失败更强大。如果需要,可以将Contains与值数组一起使用。 -
您可以使用 single
var x when listOfValues.Contains(x)来代替使用 3 或 4 或 11 个 case 语句,并根据需要处理尽可能多的 case -
我不想在这里解决案例。如我的问题案例 1,2 和 3 的第一个代码块所示,执行完全相同的右臂代码。出于这个问题的目的,我在这里举了一个非常简单的例子。想象一下案例 1,2,3 将评估非常不同和复杂的东西,例如与“何时”匹配的模式等。
-
第一个代码块落入个案例。这就是
case 1: case 2:所做的 - 它们是带有空块的情况,会掉到下一个 -
跌倒是指箱子上没有空的尸体。
标签: c# c#-8.0 switch-expression