比较c#中的两个字符串是否相等,InvariantCulture和Ordinal比较之间有什么区别?
C#中字符串类型最快的内置比较方法是什么?我不介意印刷/语义含义:目的是在排序列表中使用比较器,以便在大型集合中快速搜索.我认为只有两种方法:Compare和CompareOrdinal.什么是最快的?
另外,这些字符串比较是否有更快的方法?
我正在使用字符串比较来测试URL路径StringComparison.OrdinalIgnoreCase.
MSDN提供了以下字符串比较建议这里,但没有说明为什么:
MSDN示例(在上一页的中间):
public static bool IsFileURI(string path)
{
path.StartsWith("FILE:", StringComparison.OrdinalIgnoreCase);
return true;
}
Run Code Online (Sandbox Code Playgroud)
MSDN建议:
"但是,前面的示例使用String.StartsWith(String,StringComparison)方法来测试是否相等.因为比较的目的是测试相等而不是排序字符串,更好的选择是调用Equals方法,如如下例所示."
public static bool IsFileURI(string path)
{
if (path.Length < 5) return false;
return String.Equals(path.Substring(0, 5), "FILE:",
StringComparison.OrdinalIgnoreCase);
}
Run Code Online (Sandbox Code Playgroud)
问题:为什么MSDN建议第二个例子更好?
讨论要点:
显然,return true;在第一个例子中是一个bug,应该是return path.StartsWith(...);.我们可以安全地忽略这一点,因为VB代码是正确的.
在比较相等性之前创建子字符串似乎只使用另一个内存资源,而不仅仅是调用String.StartsWith().
长度<5测试是一个很好的短路,但它可以与之前的代码一样使用.
第二个例子可以被解释为更清晰的代码,但我关注的是性能.子串的创建似乎是不必要的.