在C#的switch-case块中比较字符串并忽略大小写

3

我有一组switch-case语句,例如“你好,你怎么样”,“嗨,我能帮你什么忙?”。如果用户输入的是逐字逐句的,即:“你好,你怎么样”,匹配就有效。

但如果用户输入“你好,你怎么样”,但大小写不同,匹配将失败。

如果用户的输入是相同的但大小写不同,则应该匹配。

"Hello, how are you" == "Hello, How are You" == "HELLO, how are YOU"

这该怎么做呢?


4
“switch” 可能不是最合适的工具。不过您可以使用 ToLower() 函数将字符串转为小写。但我认为下一个问题可能是,如何处理额外的空格或标点符号。 - TheGeneral
我无法将 switch 语句转换为小写,因为它们在 UI 的其他位置显示,因此大小写应该保持不变。 - user1144596
ToLower() 方法仅用于比较,不会修改要显示的字符串。 - Jaime
如果你使用 switch (yourValue.ToLower()),那么 switch 外部的代码不会受到 ToLower 的影响 - 不过这并不一定是一个好的做法;我只是想说“因为它们在 UI 的其他地方显示”是无关紧要的。 - Marc Gravell
请看我对此问题的回答 https://dev59.com/b3E95IYBdhLWcg3wY85l#51794712 - Flydog57
https://dev59.com/dXA75IYBdhLWcg3wv7_A#13965429 - mjwills
4个回答

6
如果您使用的是C# 7.0或更高版本,则可以像下面这样使用模式匹配switch..case
string a = "Hello, How are You";

switch (a)
{
    case string str when str.Equals("hello, how are you", StringComparison.InvariantCultureIgnoreCase):
        // Your code
        break;
    default:
        // default code
        break;

}

case string 类型检查是多余的,因为它已经知道 a 是一个字符串,所以你可以说 case {}(非空)如果你想的话。我不知道编译器是否会优化掉第二次检查。希望在某个时候,当类型已知时,C# 能够得到类似 case _ str when... 这样的东西。 - undefined

2

只需在所有内容上使用 ToLower 进行非区分大小写的转换:

switch (myString.ToLower())
{
    case "hello, how are you":
        // do something
        break;
}

3
这不是一种适合内存分配的比较字符串的方式。 - Marc Gravell

2
在C#中,字符串的switch处理程序仅限于精确字符匹配。最终有三种方法:
  • 使用if而不是switch,并利用手动字符串相等性测试 - 可能指定StringComparison以进行大小写不敏感性
  • 创建一个带有不区分大小写键比较器的字典(可能是静态的); 将您期望的字符串放入字典中 - 可能映射到私有枚举输出,然后在该输出上切换
  • 在switch操作数中使用ToLower[Invariant],并消耗分配
如果没有高吞吐量,则最后一种方法可能很好。

2
@Karan,是的,但是对于每个有意义的测试都使用whenswitch表达式实际上与一系列ifelse测试没有什么不同——只是为了符合switch语法而硬塞进去... - Marc Gravell

0

不要将两个字符串都转换为大写或小写,然后再进行比较,而应该使用可以忽略大小写的相等比较。例如:

String string1 = "Hello, how are you";
if (string1.Equals("Hello HOW are you", StringComparison.OrdinalIgnoreCase))
{
     ...
}
You should consider carefully exactly which rules are appropriate - ordinal, the current culture, the invariant culture, or possibly another culture entirely (e.g. using StringComparer.Create(culture, true)).

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接