无情地比较C#中的字符串

假设我有两个字符串:a和b。 为了比较在忽略大小写时a和是否具有相同的值,我总是使用:

// (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事情? 我在挠头。

MSDN文章的备注部分应该解释一下。 基本上,原因是跨不同文化设置的兼容性。

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

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

要么

 a.Equals(b, StringComparison.OrdinalIgnoreCase) 

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

OrdinalOrdinalIgnoreCase是一个安全的赌注,除非你知道你想使用另一种比较方法; 获取做出决定所需的信息在MSDN上阅读本文 。

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

明确而不依赖于团队知识是完美的更好。 你的队友会为此感谢你。

例:

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

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

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

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

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

您的测试是否可以显示调用ToLower()比不区分大小写的比较更快? 我的测试表明情况正好相反! 无论如何,其他海报关于正确性的观点仍然存在。