C#切换大小写string开头

有什么办法可以在switch语句中创build一个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; } 

更新其他string可以是不同的长度。

ABC ..

abczyv

dcs2。

QWERTY

如果你知道你所关心的条件的长度都是相同的长度,那么你可以:

 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)在那里,所以一个less于3个字符的string不会在子string操作上抛出exception。

有这种技术的扩展,以匹配例如一堆2string和一串3string,其中一些2字符比较匹配然后是3字符比较。 除非你有这么多的这样的string,否则对于运行代码和维护它的人来说,它很快就会比简单的if-else链接效率低下。

编辑:添加,因为你现在说,他们将是不同的长度。 你可以做我提到的模式,检查第一个X字符,然后是下一个Y字符等,但除非有一个模式,大部分string的长度相同,这将是既低效又可怕的维护(经典案例过早悲观)。

命令模式在另一个答案中提到,所以我不会详细说明,就像在string模式映射到ID时那样,但是它们是选项。

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

if-else的链可以很好地工作,不pipe是string比较还是正则expression式(后者如果比较前面的比较比前缀匹配更复杂,这可能会更简单,更快,我提到了reg-只是因为他们有时会处理这种模式的更一般的情况)。

如果你去找el-elses,试着考虑哪些情况会最常发生,并使这些testing发生在那些不太常见的情况之前(虽然当然如果“以abcd开头”就是一个例子)必须在“以abc开头”之前进行检查)。

简短的回答:不。

switch语句接受一个只被评估一次的expression式。 根据结果​​,执行另一段代码。

所以呢? => String.StartsWith是一个函数。 连同一个给定的参数,它是一个expression式。 但是,对于您的情况,您需要为每种情况传递不同的参数,因此不能仅评估一次。

长的答案#1已经被别人给出了。

长答案#2:

根据你想要达到的目标,你可能会对命令模式 / 责任链 模式感兴趣。 适用于你的情况,每一段代码将由一个命令的实现来表示。 除了execute方法之外,该命令还可以提供布尔型的Accept方法,该方法检查给定的string是否以各自的参数开始。

优点:而不是硬编码的switch语句,硬编码的StartsWith评估和硬编码string,你会有更多的灵活性。

你在问题中给出的例子看起来像这样:

 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"); } } 

如果所有情况都有相同的长度,你可以使用
switch (mystring.SubString(0,Math.Min(len, mystring.Length)))
另一种select是有一个函数,它将根据string返回categoryId并切换ID。

如果问题域有某种string标题的概念,这可以被build模为一个枚举。

 switch(GetStringHeader(s)) { case StringHeader.ABC: ... case StringHeader.QWERTY: ... ... } StringHeader GetStringHeader(string s) { if (s.StartsWith("ABC")) return StringHeader.ABC; ... } enum StringHeader { ABC, QWERTY, ... } 

除了string的答案,你可以做mystring.SubString(0,3),并检查case语句,如果它的“abc”。

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

试试这个,告诉我是否有用希望它可以帮助你:

 string value = Convert.ToString(Console.ReadLine()); Switch(value) { Case "abc": break; default: break; } 
Interesting Posts