C# 中无大小写比较字符串
-
20-08-2019 - |
题
假设我有两个字符串:a和b。为了比较忽略大小写时 a 和 be 是否具有相同的值,我总是使用:
// (Assume a and b have been verified not to be null)
if (a.ToLower() == b.ToLower())
然而,使用 Reflector,我在 .NET Framework 中见过几次这样的情况:
// (arg three is ignoreCase)
if (string.Compare(a, b, true) == 0)
我测试过哪个更快 ToLower()
打 Compare()
每次都用我用过的琴弦。
有没有理由 Compare()
代替 ToLower()
?一些关于不同的事情 CultureInfo
?我正在挠头。
解决方案
MSDN文章的注释部分应解释事情。本质上,原因是为了在不同的文化设置兼容性。
其他提示
您应该关心的主要问题是不是性能,它的正确性,并从该方面的方法,你的可能的要使用的区分大小写的比较可以是:
string.Compare(a, b, StringComparison.OrdinalIgnoreCase) == 0;
或
a.Equals(b, StringComparison.OrdinalIgnoreCase)
(如果你知道字符串可能为空第一种是有用的;后者则是简单的写,如果你已经知道至少一个字符串非空我从来没有测试的性能,但认为这将是相似的。)
Ordinal
或OrdinalIgnoreCase
是一个安全的赌注,除非你知道你想使用另一种比较方法;去做出决定阅读这篇文章在MSDN上所需的信息。
比较字符串时你应该 总是 使用显式 StringComparison 成员。字符串函数在比较字符串的方式上有些不一致。保证所使用的比较的唯一方法是 a) 记住所有这些(这包括您和团队中的每个人)或 b) 对每个函数使用显式比较。
最好是明确的,而不是依赖于群体知识的完美。你的队友会为此感谢你。
例子:
if ( StringComparison.OrdinalIgnoreCase.Equals(a,b) )
使用 ToLower 进行比较有两个我能立即想到的问题
- 它分配内存。除非绝对必要,否则比较函数不应分配内存。
- 可以通过多种方式降低琴弦。最值得注意的是序数或文化敏感性较低。.ToLower() 以哪种方式工作?就我个人而言,我不知道。传递明确的文化比依赖默认文化要好得多。
另一篇 MSDN 文章提供了一些注意事项以及在各种情况下使用哪种比较方法的建议: 在 Microsoft .NET 2.0 中使用字符串的新建议
ToLower将()不是一个比较功能,它把字符串为小写。当==运算符在C#用在字符串对象它是由编译器优化。为核心,都依赖于所看到在反射器System.String.Equals。
莫非自己信息的测试显示调用ToLower将()大于区分大小写的比较快?我的测试表明了相反的是真实的!无论如何,其它海报约正确性点站。