是使用
CompareTo()
还是Equals()
?来自MSDN:
string.CompareTo:
将此实例与指定的对象或字符串进行比较,并返回一个整数,该整数指示此实例是在排序顺序中位于指定对象或字符串的前面、后面还是出现在相同位置。
string.Equals:
确定两个String对象是否具有相同的值。
简而言之,CompareTo
用于排序,Equals
用于确定相等性。
CompareTo()
用于比较两个对象的大小关系以及它们是否相等,而Equals()
仅用于判断两个对象是否相等。
如果你只需要知道它们是否是相同的值,可以使用Equals()
。如果你还需要知道它们之间的大小关系,那么就使用CompareTo()
。
int a = 50;
int b = 10;
//if you need to know if they are equal:
if(a.Equals(b)){
//won't execute
}
//this would check if they are equal, as well
if(a.CompareTo(b) == 0){
//won't execute
}
//if you need to know if a is bigger than b, specifically:
if(a.CompareTo(b) > 0){
//will execute
}
//this would check to see if a is less than b
if(a.CompareTo(b) < 0){
//won't execute
}
最后,需要注意的是,对于像 int
这样的基本类型,这些Equals()
和 CompareTo()
方法并不是必需的,因为标准的比较运算符已经被重载了,所以你可以这样做:
//this would check if they are equal, as well
if(a == b){
//won't execute
}
//if you need to know if a is bigger than b, specifically:
if(a > b){
//will execute
}
//this would check to see if a is less than b
if(a < b){
//won't execute
}
最后,你在问题中提到了string
。对于string
,Equals()
和CompareTo()
的工作方式就像我描述的那样。只需记住,CompareTo()
对字符串进行的“比较”是基于字母顺序排序的,因此"abcdefg" < "z"
。
CompareTo
方法的功能实际上是Equals
方法功能的超集。 CompareTo
函数指定了排序顺序,之前、之后或相等,而Equals
函数仅指定相等性。因此,实际上可以通过CompareTo
来定义Equals
。
public bool Equals(string other) {
return 0 == CompareTo(other);
}
CompareTo()
仅检查对象的名称以确定排序顺序时,Equals()
可能也会检查其他字段。从[MSDN](http://msdn.microsoft.com/en-us/library/system.icomparable(v=vs.110).aspx)中获得:“此当前实例在排序顺序中与由CompareTo方法指定的对象处于相同的位置。” - 它并没有说对象相等。 - larsmoaEquals
方法用来比较两个对象是否相等,返回一个布尔值。
CompareTo
方法返回一个整数,如果当前对象小于要比较的对象则返回-1(或者其他负数),如果两个对象相等则返回0,如果当前对象大于要比较的对象则返回1(或者其他正数)。这个方法常用于排序算法。
相等性比较比大小比较更加“挑剔”,但反之不成立。CompareTo 可以说“所有对象都是相等的”,而 Equals 则表示“但有些对象比其他对象更相等!”
一个例子是 System.String。String 的 Equals 方法和 == 运算符使用序数比较,即比较每个字符的 Unicode 码点值。然而,它的 CompareTo 方法使用了一个不那么挑剔、依赖于文化的比较。例如,在大多数计算机上,字符串“ṻ”和“ǖ”在 Equals 中是不同的,但在 CompareTo 中是相同的。
这段内容来自 C# in a nutshell。
CompareTo方法是将对象实例与String对象参数进行比较。 Equals方法确定两者的值是否相同。
当您比较两个对象的值时,应使用CompareTo方法。
String str1 = "abc";
String str2 = "def"
if(strq.CompareTo(str2) //
当一个或两个值不是对象时,应使用等号。
string str1 = "abc";
if(str1.Equals("abc") //
Equals()
。在你的代码中检查a.Equals(b)
比a.CompareTo(b) == 0
更清晰。 - Andrew BarberCompareTo
方法。Equals
方法始终存在,因为它是由基类Object
提供的。 - Cody Gray