C#Switch-case字符串以。开头

时间:2010-10-04 08:37:01

标签: c# string switch-statement case

有没有办法在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;
}

更新 其他字符串的长度可以不同。

ABC ..

abczyv

dcs2。

QWERTY

如...,K

7 个答案:

答案 0 :(得分: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;
}

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开头”之前进行检查。

答案 1 :(得分:13)

简短回答:不。

switch语句采用仅计算一次的表达式。根据结果​​,执行另一段代码。

那又怎样? => String.StartsWith是一个函数。与给定参数一起,它是一个表达式。但是,对于您的情况,您需要为每种情况传递不同的参数,因此不能仅对其进行一次评估。

其他人已经给出了长期答案#1。

长答案#2:

根据您要实现的目标,您可能会对 Command Pattern / Chain-of-responsibility pattern 感兴趣。应用于您的案例,每段代码都将由 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");
    }
}    

答案 2 :(得分:5)

如果所有情况都有相同的长度,您可以使用
switch (mystring.SubString(0,Math.Min(len, mystring.Length)))
另一种选择是使用一个函数,它将根据字符串返回categoryId并打开id。

答案 3 :(得分:3)

如果问题域具有某种字符串头概念,则可以将其建模为枚举。

switch(GetStringHeader(s))
{
    case StringHeader.ABC: ...
    case StringHeader.QWERTY: ...
    ...
}

StringHeader GetStringHeader(string s)
{
    if (s.StartsWith("ABC")) return StringHeader.ABC;
    ...
}

enum StringHeader { ABC, QWERTY, ... }

答案 4 :(得分:2)

现在可以使用C#7.0的模式匹配。例如:

var myString = "abcDEF";

switch(myString)
{
    case string x when x.StartsWith("abc"):
        //Do something here
        break;
}

答案 5 :(得分:1)

除了子串回答之外,您可以将其作为mystring.SubString(0,3)执行,并检查case语句是否为“abc”。

但在switch语句之前,你需要确保你的mystring的长度至少为3。

答案 6 :(得分:-7)

试试这个并告诉我它是否有效希望它可以帮到你:

string value = Convert.ToString(Console.ReadLine());

Switch(value)
{
    Case "abc":

    break;

    default:

    break;
}