我可以像这样在c#中编写switch case吗?
switch (string)
case [a..z]+
// do something
case [A..Z]+
// do something
....
答案 0 :(得分:16)
是的,你可以在C#7:
switch (someString)
{
case var someVal when new Regex(@"[a..z]+").IsMatch(someVal):
// do something
break;
case var someVal when new Regex(@"[A..Z]+").IsMatch(someVal):
// do something
break;
}
答案 1 :(得分:4)
使用_作为丢弃词,对David的出色回答进行了细微的改进。 只是一个非常简单的字符串值作为示例。
using System;
using System.Text.RegularExpressions;
public class Program
{
public static void Main()
{
string userName = "Fred";
int something = 0;
switch (true)
{
case bool _ when Regex.IsMatch(userName, @"Joe"):
something = 1;
break;
case bool _ when Regex.IsMatch(userName, @"Fred"):
something = 2;
break;
default:
break;
}
Console.WriteLine(something.ToString());
}
}
答案 2 :(得分:3)
你应该可以这样做:
using System.Text.RegularExpressions;
private void fauxSwitch(string caseSwitch)
{
if(Regex.Match(caseSwitch, @"[a..z]+").Success)
{
//do something
return;
}
if(Regex.Match(caseSwitch, @"[A..Z]+").Success)
{
//do something
return;
}
/*default*/
//do something
}
虽然,C#7中的模式匹配可能是更好的选择。
答案 3 :(得分:2)
没有。在C#(7之前)中,switch语句只接受常量值。
如您所建议的那样使用更复杂的表达式是一种称为'模式匹配的功能'在函数式编程世界中。
模式匹配包含在C#7
中答案 4 :(得分:1)
从 C# 8.0 开始,现在答案是肯定的!......有点。
在 8.0 中,引入了 switch expression。您可以使用它来匹配许多不同样式的图案,如下所示。
string myValueBeingTested = "asdf";
string theResultValue = myValueBeingTested switch
{
var x when
Regex.IsMatch(x, "[a..z]+") => "everything is lowercase",
var y when
Regex.IsMatch(y, "[A..Z]+") => "EVERYTHING IS UPPERCASE",
"Something Specific" => "The Specific One",
_ => "The default, no match scenario"
};
工作原理:switch 表达式需要一个变量,它可以将结果输入到其中。上面的示例为此使用了 theResultValue
变量。接下来,将上面的myValueBeingTested
表示的范围表达式 传递给开关。熟悉的case 构造被替换为模式表达式,后跟=>
标记,并一起称为表达式n 臂。 arm 标记右侧的任何内容都将在结果变量中结束。
通常switch 表达式要求模式是编译时常量,并且您不能在switch 表达式中执行任意代码。但是,我们可以使用 case gaurd 模式,通过使用 when
子句来使用 Regex,如上所示。每个案例都需要连接到具有不同一次性变量的不同 arm 中(上面的 x
和 y
)。
上面显示的第三个 arm 是一个编译时常量字符串,可根据需要匹配某些特定文本。上面显示的第四个 arm 使用 _
模式,这是一种类似于旧的 default:
关键字的通配符。您还可以使用 null
代替 _
或除 > db.test.find({ })
之外单独处理 null 情况。
在我的 .NET Fiddle sample here 中试用。