WEB开发网
开发学院软件开发C语言 总结字符串比较函数 阅读

总结字符串比较函数

 2010-09-30 22:39:16 来源:WEB开发网   
核心提示: 方法很长,但是很简单,总结字符串比较函数(4),即使是Reflector 出来的变量名很BT,但是我们也可以大致看个究竟,下文会解释清楚)4. 总结本文主要介绍了String类型的比较方法,也留下了一些疑问,他是将整个字符串每5个字符(10个字节)分成一组,然后逐个比较

方法很长,但是很简单,即使是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类型的比较方法,也留下了一些疑问,也希望可以得到各位的解答。

上一页  1 2 3 4 

Tags:总结 字符串 比较

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接