C#开关大小写字符串以

有什么方法可以在switch语句中创建条件条件,即您说字符串是否以某些内容开头吗?

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

分解。

qwerty

Amra asked 2020-08-12T07:49:45Z
7个解决方案
38 votes

如果您知道要关注的条件的长度都相同,则可以:

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字符的字符串和一串3字符的字符串,其中一些2字符比较匹配之后是3字符比较。 除非您有大量这样的字符串,否则对于正在运行的代码和必须维护它的人员而言,它很快就会变得不如简单的if-else链接有效。

编辑:添加,因为您现在已经声明它们的长度不同。 您可以执行我提到的检查前X个字符,然后检查下一个Y字符的模式,依此类推,但是除非有一个模式,其中大多数字符串的长度相同,否则维护起来效率低下而且令人恐惧(经典情况) 过早的悲观化)。

在另一个答案中提到了命令模式,因此我不会提供详细信息,因为您将字符串模式映射到ID,但这是可选的。

我不会从if-else链更改为命令或映射模式,以获得效率切换有时会超过if-else,因为您在比较命令或获取ID模式时会损失更多。 如果可以使代码更清晰,我会这样做。

一串if-else可以很好地与字符串比较或使用正则表达式配合使用(后者,如果您的比较比到目前为止的前缀匹配更复杂,那可能会更简单,更快捷,我在这里提到reg- ex只是因为它们有时可以在这种模式的更一般情况下很好地工作)。

如果您使用if-elses,请尝试考虑哪些情况最常发生,并使这些测试先于不太常见的情况进行(尽管当然,如果“以abcd开头”是一个案例) 必须在“以abc开头”之前进行检查)。

Jon Hanna answered 2020-08-12T07:50:25Z
13 votes

简短答案:不可以。

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");
    }
}    
chiccodoro answered 2020-08-12T07:51:17Z
6 votes

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

var myString = "abcDEF";

switch(myString)
{
    case string x when x.StartsWith("abc"):
        //Do something here
        break;
}
Raúl Bojalil answered 2020-08-12T07:51:37Z
5 votes

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

Itay Karo answered 2020-08-12T07:52:06Z
3 votes

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

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

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

enum StringHeader { ABC, QWERTY, ... }
Felix Ungman answered 2020-08-12T07:52:26Z
1 votes

除了子字符串答案,您还可以将其作为mystring.SubString(0,3)进行检查,并检查case语句是否为“ abc”。

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

Sachin Shanbhag answered 2020-08-12T07:52:51Z
-7 votes

试试这个,告诉我是否可行,希望对您有帮助:

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

Switch(value)
{
    Case "abc":

    break;

    default:

    break;
}       
Amaterasu Hiro answered 2020-08-12T07:53:12Z
translate from https://stackoverflow.com:/questions/3853700/c-sharp-switch-case-string-starting-with