假设我有两个字符串: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
的事情?我在挠头。
答案 0 :(得分:23)
你应该关注的主要问题不是性能,它是正确的,从这个方面来说,可能想要用于不区分大小写的比较的方法是:
string.Compare(a, b, StringComparison.OrdinalIgnoreCase) == 0;
或
a.Equals(b, StringComparison.OrdinalIgnoreCase)
(如果你知道字符串可能为null,那么第一个是有用的;如果你已经知道至少有一个字符串是非空的,那么后者更容易编写。我从未测试过性能但是假设它将是相似的。)
除非您知道要使用其他比较方法,否则 Ordinal
或OrdinalIgnoreCase
是安全的选择;获取做出决定所需的信息read this article on MSDN。
答案 1 :(得分:6)
MSDN article的备注部分应该解释事情。基本上,原因是跨不同文化环境的兼容性。
答案 2 :(得分:3)
比较字符串时,您应始终使用显式StringComparison成员。 String函数在选择比较字符串方面有些不一致。保证比较使用的唯一方法是a)记住所有这些(包括你和团队中的每个人)或b)对每个函数使用显式比较。
明确而不依赖于团队知识是完美的更好。你的队友会为此感谢你。
示例:
if ( StringComparison.OrdinalIgnoreCase.Equals(a,b) )
使用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()比不区分大小写的比较更快?我的测试表明情况正好相反!无论如何,其他海报关于正确性的观点仍然存在。