鉴于像这样的字符串:
string s1 = "Abc";
string s2 = "ABC";
哪个更快:
Regex.Match(s1, s2, RegexOptions.IgnoreCase)
或者
s1.ToLower() == s2.ToLower()
如果它们相同或其中一个更快,那么什么时候使用哪个更好?
鉴于像这样的字符串:
string s1 = "Abc";
string s2 = "ABC";
哪个更快:
Regex.Match(s1, s2, RegexOptions.IgnoreCase)
或者
s1.ToLower() == s2.ToLower()
也许第二种方法更快,但我会避免使用这两种方法。
更好的方法是使用适当的StringComparison
参数和方法string.Equals
:
s1.Equals(s2, StringComparison.CurrentCultureIgnoreCase)
在线查看运行结果:ideone
@Mark Byers已经发布了正确的答案。
我想强调你不应该使用ToLower进行字符串比较。这是不正确的。
s1.Equals(s2, StringComparison.CurrentCultureIgnoreCase) //#1
s1.ToLower() == s2.ToLower() //#2
s1.ToLowerInvariant() == s2.ToLowerInvariant() //#3
涉及到异国语言和奇特字符时,(2) 和 (3) 都是不正确的。土耳其语的"I" 是经典例子。
始终使用 #1,即使在哈希表中也是如此。
(除非有非常特殊的情况)
需要注意的是,Regex.Match(s1, s2, RegexOptions.IgnoreCase)
在一般情况下不是检查不区分大小写的相等性的安全方法。考虑当s2
是".*"
的情况。无论s1
是什么,Regex.Match
都将返回true!
比较会更快,但是不要将字符串转换为小写或大写然后再进行比较,最好使用可以忽略大小写的相等比较。例如:
s1.Equals(s2, StringComparison.OrdinalIgnoreCase)
这里是三种方法的小比较:
正则表达式:282毫秒 ToLower:67毫秒 Equals:34毫秒
public static void RunSnippet()
{
string s1 = "Abc";
string s2 = "ABC";
// Preload
compareUsingRegex(s1, s2);
compareUsingToLower(s1, s2);
compareUsingEquals(s1, s2);
// Regex
Stopwatch swRegex = Stopwatch.StartNew();
for (int i = 0; i < 300000; i++)
compareUsingRegex(s1, s2);
Console.WriteLine(string.Format("Regex: {0} ms", swRegex.ElapsedMilliseconds));
// ToLower
Stopwatch swToLower = Stopwatch.StartNew();
for (int i = 0; i < 300000; i++)
compareUsingToLower(s1, s2);
Console.WriteLine(string.Format("ToLower: {0} ms", swToLower.ElapsedMilliseconds));
// ToLower
Stopwatch swEquals = Stopwatch.StartNew();
for (int i = 0; i < 300000; i++)
compareUsingEquals(s1, s2);
Console.WriteLine(string.Format("Equals: {0} ms", swEquals.ElapsedMilliseconds));
}
private static bool compareUsingRegex(string s1, string s2)
{
return Regex.IsMatch(s1, s2, RegexOptions.IgnoreCase);
}
private static bool compareUsingToLower(string s1, string s2)
{
return s1.ToLower() == s2.ToLower();
}
private static bool compareUsingEquals(string s1, string s2)
{
return s1.Equals(s2, StringComparison.CurrentCultureIgnoreCase);
}
IsMatch()
方法,结果如下:Regex: 71ms
,ToLower: 51 ms
,Equals: 23 ms
。 - Alan Moores2
包含实际正则表达式的情况。 - user7116