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

时间:2009-02-02 00:30:54

标签: c# .net string string-comparison

假设我有两个字符串: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()。{/ p>

Compare()代替ToLower()是否有原因?关于不同CultureInfo的事情?我在挠头。

6 个答案:

答案 0 :(得分:23)

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

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

a.Equals(b, StringComparison.OrdinalIgnoreCase)

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

除非您知道要使用其他比较方法,否则

OrdinalOrdinalIgnoreCase是安全的选择;获取做出决定所需的信息read this article on MSDN

答案 1 :(得分:6)

MSDN article的备注部分应该解释事情。基本上,原因是跨不同文化环境的兼容性。

答案 2 :(得分:3)

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

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

示例:

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

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

另一篇MSDN文章提供了一些DO和DON'T以及在各种情况下使用哪种比较方法的建议:New Recommendations for Using Strings in Microsoft .NET 2.0

答案 5 :(得分:0)

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