13

假设我有两个字符串: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吗?我在挠头。

4

6 回答 6

23

您应该关注的主要不是性能,而是正确性,从这方面来看,您可能希望用于不区分大小写的比较的方法是:

string.Compare(a, b, StringComparison.OrdinalIgnoreCase) == 0;

或者

a.Equals(b, StringComparison.OrdinalIgnoreCase)

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

Ordinal或者OrdinalIgnoreCase是一个安全的赌注,除非你知道你想使用另一种比较方法;要获得做出决定所需的信息,请阅读 MSDN 上的这篇文章

于 2009-02-02T00:38:31.377 回答
6

MSDN 文章的备注部分应该解释一些事情。从本质上讲,原因是为了跨不同文化设置的兼容性。

于 2009-02-02T00:41:34.363 回答
3

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

最好是明确的,而不是依赖于完美的群体知识。你的队友会为此感谢你的。

例子:

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

使用 ToLower 进行比较有 2 个我能想到的问题

  1. 它分配内存。除非绝对必要,否则比较函数不应分配内存。
  2. 可以通过多种方式降低琴弦。最显着的 Ordinal 或 Culture Sensitive 较低。.ToLower() 以哪种方式工作?就个人而言,我不知道。传递明确的文化比依赖默认文化要好得多。
于 2009-02-02T00:40:08.173 回答
0

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

于 2009-02-02T00:34:26.080 回答
0

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

于 2009-02-02T00:51:28.387 回答
0

您能否发布显示调用 ToLower() 的测试比不区分大小写的比较更快?我的测试表明事实恰恰相反!无论如何,其他张贴者关于正确性的观点是站得住脚的。

于 2009-03-05T19:30:59.447 回答