字符串比较 - strA.ToLower()==strB.ToLower() 还是 strA.Equals(strB,StringComparisonType)?

25
根据标题,你使用什么字符串比较方法以及为什么使用它?
4个回答

42

你没有指定平台,但我猜测是.NET。我强烈建议你使用后一种形式——因为大小写比较并不像你所预期的那样简单。(这也避免了创建额外的字符串,但那是另一回事。)

例如,当在土耳其运行时,当你的代码面对"mail"和"MAIL"时,你想让你的代码做什么?如果你使用ToLower,它将返回false;如果你使用CurrentCultureIgnoreCase,它也会返回false;但如果你使用InvariantCultureIgnoreCase,它将返回true。你需要考虑数据的来源和你尝试用它来实现什么。

有关更多信息和指导,请参见MSDN中有关使用字符串的建议

除此之外,我认为后一种表达方式更有效地表达了你的意图。你实际上并不关心字符串的小写值——你关心以一种不区分大小写的方式相等性……而这正是第二种形式所表达的。


你能否深入解释一下在土耳其中使用“mail”和“MAIL”的示例?为什么我应该在这种情况下期望False? - Valentyn Vynogradskiy
6
因为在土耳其(使用土耳其文化/语言环境)将“mail”转换为大写时,并不会得到"M​​AIL",因为"I"的大写形式不同。 - Jon Skeet

10
Equals 调用比较高效,因为它只涉及一次字符串操作,而不是三次。
使用 StringComparison.OrdinalIgnoreCase 选项可以获得最佳的不区分大小写比较性能。然而,由于它不考虑文化差异,可能不总是给出您想要的结果。
如果您想更改用于比较的大小写,建议使用 ToUpper 而不是 ToLower。某些奇特的字母无法正确地从大写转换为小写,但从小写转换为大写则有效。
在大多数情况下,性能并不重要,因此应根据情况使用最合适的选择。
您没有指定使用的语言,但从 == 运算符看来,这似乎是 C#。如果您使用 VB,则应注意 = 运算符不使用字符串类的等式运算符,而是 VB 自己的逻辑进行比较,略有不同。

0

我觉得用第二个比第一个更好。因为第二种类型支持所有语言,使用起来更方便。


0

基准测试:

方法 平均值 误差 标准偏差 Gen0 分配的内存
ToLower 47.653 纳秒 2.0118 纳秒 0.1103 纳秒 0.0127 80 字节
OrdinalIgnoreCase 7.432 纳秒 0.1664 纳秒 0.0091 纳秒 - -

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