c#的字符串是如何进行大小比较的?

kwklover 2007-07-28 05:43:14
即String.CompareOrdinal(strA,strB)
内部的实现原理或机制是什么 ?
...全文
1476 13 打赏 收藏 举报
写回复
13 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
cheng_er 2008-12-03
3、5、6不错
学到了
  • 打赏
  • 举报
回复
zjybushiren88888 2008-12-03
按照unicode编码
  • 打赏
  • 举报
回复
Layne的博客 2008-12-03
刚好看了一篇文章,其实就是实现CompareOrdinal方法,还涉及到了冒泡排序,可以看一下
http://www.xianguo.com/go.php?fi=432020048
  • 打赏
  • 举报
回复
king520520 2008-11-30
即String.CompareOrdinal(strA,strB)
内部的实现原理或机制是什么 ?

答:

字符串是按照unicode编码比较的.
比如说abc和ab相比较,先比第一个a,如果相等比较第二个b.
如果第二个b也相等比较c,而abc中包括c,ab没有c,所以abc大,返回+1
  • 打赏
  • 举报
回复
luyanvv 2008-11-30
我晕,唉,现在还是在后面的哪,看不懂
  • 打赏
  • 举报
回复
OceanLee 2007-07-30
怎么反编译的阿?
  • 打赏
  • 举报
回复
kwklover 2007-07-30
@viena() 维也纳(windows7)
我也反编译过他的原代码,不过没看出什么东西来,所以来这里问问各位高手...

@windboyzsj(落叶)
谢谢你的推荐.
  • 打赏
  • 举报
回复
windboyzsj 2007-07-28
更正:
实例的Equals()
静态的Equals()
静态的Compare()
实例的CompareTo()
实例的CompareOrdinal()
==操作符
  • 打赏
  • 举报
回复
windboyzsj 2007-07-28
说白了就是逐字符比较编码(.NET中字符用Unicode编码)的大小

========================
不完全是,有些比较是否相等时,是比较散列码的,有些是比较引用的,有些则是逐字符比较
另外比较方法有很多种

实例的Equals()
静态的Equals()
CompareTo()
CompareTo()
CompareOrdinal()
==操作符

个种比较在不同情况可能有不用的效率

C#字符串还涉及内置池,Automation 等技术,当字符串数据量较大是,优化的代码与
不优化的代码性能可能差好几十倍的

推荐你一本书<<C#字符串和正规表达式参考手册>> 清华出版社
里面有较精彩的解析
  • 打赏
  • 举报
回复
viena 2007-07-28
说白了就是逐字符比较编码(.NET中字符用Unicode编码)的大小
  • 打赏
  • 举报
回复
viena 2007-07-28
反编译看一下:

public static int CompareOrdinal(string strA, string strB)
{
if (strA == strB)
{
return 0;
}
if (strA == null)
{
return -1;
}
if (strB == null)
{
return 1;
}
return CompareOrdinalHelper(strA, strB);
}



private static unsafe int CompareOrdinalHelper(string strA, string strB)
{
int num = Math.Min(strA.Length, strB.Length);
int num2 = -1;
fixed (char* str = ((char*) strA))
{
char* chPtr = str;
fixed (char* str2 = ((char*) strB))
{
char* chPtr2 = str2;
char* chPtr3 = chPtr;
char* chPtr4 = chPtr2;
while (num >= 10)
{
if (*(((int*) chPtr3)) != *(((int*) chPtr4)))
{
num2 = 0;
break;
}
if (*(((int*) (chPtr3 + 2))) != *(((int*) (chPtr4 + 2))))
{
num2 = 2;
break;
}
if (*(((int*) (chPtr3 + 4))) != *(((int*) (chPtr4 + 4))))
{
num2 = 4;
break;
}
if (*(((int*) (chPtr3 + 6))) != *(((int*) (chPtr4 + 6))))
{
num2 = 6;
break;
}
if (*(((int*) (chPtr3 + 8))) != *(((int*) (chPtr4 + 8))))
{
num2 = 8;
break;
}
chPtr3 += 10;
chPtr4 += 10;
num -= 10;
}
if (num2 == -1)
{
goto Label_0101;
}
chPtr3 += num2;
chPtr4 += num2;
int num3 = chPtr3[0] - chPtr4[0];
if (num3 != 0)
{
return num3;
}
return (chPtr3[1] - chPtr4[1]);
Label_00E7:
if (*(((int*) chPtr3)) != *(((int*) chPtr4)))
{
goto Label_0105;
}
chPtr3 += 2;
chPtr4 += 2;
num -= 2;
Label_0101:
if (num > 0)
{
goto Label_00E7;
}
Label_0105:
if (num > 0)
{
int num4 = chPtr3[0] - chPtr4[0];
if (num4 != 0)
{
return num4;
}
return (chPtr3[1] - chPtr4[1]);
}
return (strA.Length - strB.Length);
}
}
}

  • 打赏
  • 举报
回复
he_8134 2007-07-28
编码里面的位置~~~~~
  • 打赏
  • 举报
回复
viena 2007-07-28
通过计算每个字符串中相应Char对象的数值来比较两个指定的String对象
  • 打赏
  • 举报
回复
相关推荐
发帖
C#
加入

10.7w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2007-07-28 05:43
社区公告

让您成为最强悍的C#开发者