繁体   English   中英

在C#中无差别地比较字符串

[英]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)

(如果您知道字符串可能为空,则第一个很有用;如果您已经知道至少一个字符串为非空,则后者更易于编写。我从未测试过性能,但假设它会是相似的。)

除非您知道要使用其他比较方法,否则OrdinalOrdinalIgnoreCase是安全的选择。 要获取做出决定所需的信息, 请在MSDN上阅读此文章

MSDN文章的 “备注”部分应对此进行解释。 本质上,原因是跨不同文化区域设置的兼容性。

比较字符串时,应始终使用显式的StringComparison成员。 字符串函数在选择比较字符串的方式上有些不一致。 保证使用的比较的唯一方法是:a)记住所有这些内容(包括您和团队中的每个人)或b)对每个功能使用显式比较。

明确而又不依赖于完美的团队知识要好得多。 您的队友将为此感谢您。

例:

if ( StringComparison.OrdinalIgnoreCase.Equals(a,b) )

使用ToLower进行比较有两个问题,我可以想到

  1. 它分配内存。 除非绝对必要,否则比较函数不应分配内存。
  2. 可以通过几种方法降低字符串。 最值得注意的是序数或文化敏感度较低。 .ToLower()以哪种方式工作? 就我个人而言,我不知道。 传递明确的文化比依赖默认文化好得多。

ToLower()不是比较函数,它将字符串转换为小写。 在C#中的String对象上使用==运算符时,编译器会对其进行优化。 从根本上说,两者都依赖于System.String.Equals,如Reflector所示。

另一篇MSDN文章,提供了一些DO和DON以及在各种情况下使用哪种比较方法的建议: Microsoft .NET 2.0中使用字符串的新建议

您的帖子可以显示调用ToLower()比不区分大小写的比较要快吗? 我的测试表明事实恰恰相反! 无论如何,其他张贴者关于正确性的观点仍然存在。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM