总结字符串比较函数
2010-09-30 22:39:16 来源:WEB开发网方法很长,但是很简单,即使是Reflector 出来的变量名很BT,但是我们也可以大致看个究竟。
他是将整个字符串每5个字符(10个字节)分成一组,然后逐个比较,找到第一个不相同的ASCII码后退出循环。并且求出两者的ASCII码的差。
不过我很费解的是微软为什么要把这个实现的如此麻烦。只能等到周一再求解了。
但是在CLR via C#上有这样的话:
这个方法比其他方法都要快。
我想应该是有一定道理的吧。
所以当我们比较大小的时候,尽量使用CompareOrdinal方法。
3. 常用的Equals方法
先来看Equals实例方法:
查看原图(大图)
方法会首先进行合法性判断,然后比较两者是否指向同一块引用,接下来调用EqualsHelper方法(不清楚微软为什么很沉迷于XXXHelper这个命名,难道XXXHelper这个名词不应该是一个类名么?)
private static unsafe bool EqualsHelper(string strA, string strB)
{
int length = strA.Length;
if (length != strB.Length)
{
return false;
}
fixed (char* chRef = &strA.m_firstChar)
{
fixed (char* chRef2 = &strB.m_firstChar)
{
char* chPtr = chRef;
char* chPtr2 = chRef2;
while (length >= 10)
{
if ((((*(((int*)chPtr)) != *(((int*)chPtr2))) || (*(((int*)(chPtr + 2))) != *(((int*)(chPtr2 + 2))))) || ((*(((int*)(chPtr + 4))) != *(((int*)(chPtr2 + 4)))) || (*(((int*)(chPtr + 6))) != *(((int*)(chPtr2 + 6)))))) || (*(((int*)(chPtr + 8))) != *(((int*)(chPtr2 + 8)))))
{
break;
}
chPtr += 10;
chPtr2 += 10;
length -= 10;
}
while (length > 0)
{
if (*(((int*)chPtr)) != *(((int*)chPtr2)))
{
break;
}
chPtr += 2;
chPtr2 += 2;
length -= 2;
}
return (length <= 0);
}
}
}
迷糊了,又是这样的算法,我实在不了解10字节究竟有什么奥秘,周一如果问到答案会对其进行解释。
然而,值得肯定的是,由于是非安全代码的比较,所以效率要比我们用安全代码高得多。
接下来看看Equals静态方法:
(关于==的运算符重载之前有误,下文会解释清楚)
4. 总结
本文主要介绍了String类型的比较方法,也留下了一些疑问,也希望可以得到各位的解答。
更多精彩
赞助商链接