Amr*_*mra 42 c# string case switch-statement
有没有办法在switch语句中创建一个case条件,你会说一个字符串是否以某个东西开头?
前
Switch (mystring)
{
case("abc")://String begins with abc (abcd or abc1 or abcz or abc.. or abc will fall in this condition).
//Do Something
break;
default:
break;
}
Run Code Online (Sandbox Code Playgroud)
更新 其他字符串可以是不同的长度.
ABC ..
abczyv
dcs2.
QWERTY
问
Jon*_*nna 38
如果您知道您所关心的条件长度都是相同的长度,那么您可以:
switch(mystring.substring(0, Math.Min(3, mystring.Length))
{
case "abc":
//do something
break;
case "xyz":
//do something else
break;
default:
//do a different thing
break;
}
Run Code Online (Sandbox Code Playgroud)
这Math.Min(3, mystring.Length)是因为少于3个字符的字符串不会在子字符串操作上引发异常.
这种技术的扩展可以匹配例如一堆2-char字符串和一串3-char字符串,其中一些2-char比较匹配然后是3-char比较.除非你有很多这样的字符串,否则很快就会变得比简单的if-else链接效率更低,因为正在运行的代码和必须维护它的人.
编辑:添加,因为你现在说他们将有不同的长度.你可以做我提到的检查前X个字符然后下一个Y字符等的模式,但是除非有一个模式,其中大多数字符串都是相同的长度,这将是既低效又难以维护(经典案例)过早的悲观情绪).
另一个答案中提到了命令模式,因此我不会详细说明,例如将字符串模式映射到ID,但它们是选项.
我不会从if-else链变为命令或映射模式以获得效率开关有时会超过if-else,因为在命令的比较中丢失更多或获得ID模式.如果它使代码更清晰,我会这样做.
if-else链可以很好地工作,无论是使用字符串比较还是使用正则表达式(后者如果你的比较比前缀匹配更复杂到目前为止,这可能更简单,更快,我提到reg- ex只是因为它们有时适用于这种模式的更一般情况).
如果您选择if-elses,请尝试考虑哪些情况最常发生,并在那些不太常见的情况下进行测试(当然,如果"以abcd开头"是寻找它的情况,必须在"以abc开头"之前进行检查.
chi*_*oro 13
简答:不.
switch语句采用仅计算一次的表达式.根据结果,执行另一段代码.
所以呢?=> String.StartsWith是一个函数.与给定参数一起,它是一个表达式.但是,对于您的情况,您需要为每种情况传递不同的参数,因此不能仅对其进行一次评估.
其他人给出了长期答案#1.
答案很长#2:
根据您要实现的目标,您可能对命令模式/责任链模式感兴趣.应用于您的案例,每段代码将由Command的实现表示.除了execute方法之外,该命令还可以提供一个布尔Accept方法,该方法检查给定的字符串是否以相应的参数开头.
优势:代替硬编码的switch语句,硬编码的StartsWith评估和硬编码字符串,您将拥有更多的灵活性.
您在问题中给出的示例将如下所示:
var commandList = new List<Command>() { new MyABCCommand() };
foreach (Command c in commandList)
{
if (c.Accept(mystring))
{
c.Execute(mystring);
break;
}
}
class MyABCCommand : Command
{
override bool Accept(string mystring)
{
return mystring.StartsWith("abc");
}
}
Run Code Online (Sandbox Code Playgroud)
小智 7
现在,可以使用C#7.0的模式匹配。例如:
var myString = "abcDEF";
switch(myString)
{
case string x when x.StartsWith("abc"):
//Do something here
break;
}
Run Code Online (Sandbox Code Playgroud)
如果所有情况都具有相同的长度,您可以使用
switch (mystring.SubString(0,Math.Min(len, mystring.Length))).
另一种选择是有一个函数,它将根据字符串返回categoryId并切换id.