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

cor*_*ore 13 .net c# string string-comparison

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

// (Assume a and b have been verified not to be null)

if (a.ToLower() == b.ToLower())
Run Code Online (Sandbox Code Playgroud)

但是,使用Reflector,我在.NET Framework中已经看过几次:

// (arg three is ignoreCase)

if (string.Compare(a, b, true) == 0)
Run Code Online (Sandbox Code Playgroud)

我测试哪个更快,每次用我使用的字符串ToLower()节拍Compare().

是否有理由Compare()而不是ToLower()?有什么不同的CultureInfo?我在挠头.

Gre*_*ech 23

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

string.Compare(a, b, StringComparison.OrdinalIgnoreCase) == 0;
Run Code Online (Sandbox Code Playgroud)

要么

a.Equals(b, StringComparison.OrdinalIgnoreCase)
Run Code Online (Sandbox Code Playgroud)

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

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


Nol*_*rin 6

MSDN文章的备注部分应该解释一下.从本质上讲,原因是不同文化背景下的兼容性.