社区
C#
帖子详情
c#的字符串是如何进行大小比较的?
kwklover
2007-07-28 05:43:14
即String.CompareOrdinal(strA,strB)
内部的实现原理或机制是什么 ?
...全文
1688
13
打赏
收藏
c#的字符串是如何进行大小比较的?
即String.CompareOrdinal(strA,strB) 内部的实现原理或机制是什么 ?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
13 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
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对象
SpringBoot —— AOP注解式拦截与方法规则拦截
AspectJ是一个面向切面的框架,它扩展了Java语言。AspectJ定义了AOP语法,所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件。 SpringBoot中AOP的使用方式主要有两种:注解式拦截与方法规则拦截,具体使用如下文所示。 一、创建一个简单springboot 2.03项目,添加aop依赖 <dependency> <...
Maven项目导入AOP依赖
需要先定义一个单独的aop类,在这个类里面写aop方法。
Java通过自定义注解实现拦截类及其内部所有方法
Java通过自定义注解实现拦截类及其内部所有方法 SpringBoot项目自定义注解实现拦截类及其内部方法 1.引入AOP依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> 2.编写注解 import java.lang.annota
SpringBoot——Aop
前言 什么是面向切面编程,经过springboot的又一遍复习,再次了解Aop的时候,对此还是不太明白,直到现在,我所了解的AOP其实就是将逻辑方法
进行
简单归类,即一个或多个方法
进行
统一管理,很多教程喜欢直接用切面、切入点、连接点等术语来解释,不知道大家看的时候怎么样,一开始我确实很MB。 假设有一个MVC流程,从控制
Spring Boot 使用 Aop 实现日志全局拦截
前面的章节我们学习到 Spring Boot Log 日志使用教程 和 Spring Boot 异常处理与全局异常处理,本章我们结合 Aop 面向切面编程来实现全局拦截异常并记录日志。 在 Spring Boot 中 Aop 与 Ioc 可以说是 Spring 的灵魂,其功能也是非常强大。 本项目源码下载 1 新建 Spring Boot 项目 1)File > New > ...
C#
111,129
社区成员
642,541
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章