[英]Caselessly comparing strings in C#
假设我有两个字符串: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()
。
有理由为什么要用Compare()
而不是ToLower()
吗? 关于不同的CultureInfo
东西? 我挠头。
您应该关注的主要不是性能,而是正确性,从这个方面来说,您可能要用于不区分大小写的比较的方法是:
string.Compare(a, b, StringComparison.OrdinalIgnoreCase) == 0;
要么
a.Equals(b, StringComparison.OrdinalIgnoreCase)
(如果您知道字符串可能为空,则第一个很有用;如果您已经知道至少一个字符串为非空,则后者更易于编写。我从未测试过性能,但假设它会是相似的。)
除非您知道要使用其他比较方法,否则Ordinal
或OrdinalIgnoreCase
是安全的选择。 要获取做出决定所需的信息, 请在MSDN上阅读此文章 。
MSDN文章的 “备注”部分应对此进行解释。 本质上,原因是跨不同文化区域设置的兼容性。
比较字符串时,应始终使用显式的StringComparison成员。 字符串函数在选择比较字符串的方式上有些不一致。 保证使用的比较的唯一方法是:a)记住所有这些内容(包括您和团队中的每个人)或b)对每个功能使用显式比较。
明确而又不依赖于完美的团队知识要好得多。 您的队友将为此感谢您。
例:
if ( StringComparison.OrdinalIgnoreCase.Equals(a,b) )
使用ToLower进行比较有两个问题,我可以想到
ToLower()不是比较函数,它将字符串转换为小写。 在C#中的String对象上使用==运算符时,编译器会对其进行优化。 从根本上说,两者都依赖于System.String.Equals,如Reflector所示。
另一篇MSDN文章,提供了一些DO和DON以及在各种情况下使用哪种比较方法的建议: Microsoft .NET 2.0中使用字符串的新建议
您的帖子可以显示调用ToLower()比不区分大小写的比较要快吗? 我的测试表明事实恰恰相反! 无论如何,其他张贴者关于正确性的观点仍然存在。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.