C#: CompareTo(String)和Equals(String)有什么区别?

19
我想知道在C#中比较字符串时,哪种方法更适合使用以及为什么?
是使用CompareTo()还是Equals()
6个回答

24

来自MSDN

string.CompareTo:

将此实例与指定的对象或字符串进行比较,并返回一个整数,该整数指示此实例是在排序顺序中位于指定对象或字符串的前面、后面还是出现在相同位置。

string.Equals:

确定两个String对象是否具有相同的值。

简而言之,CompareTo用于排序,Equals用于确定相等性。


19

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。对于stringEquals()CompareTo()的工作方式就像我描述的那样。只需记住,CompareTo()对字符串进行的“比较”是基于字母顺序排序的,因此"abcdefg" < "z"


谢谢!所以,如果我们只想看它们是否是相同的值,使用Equals()比CompareTo()更高效?使用Equals的优点是什么? - TheOneTeam
2
可能有一些微小的性能差异,我猜。如果你只需要知道相等性,是的;使用Equals()。在你的代码中检查a.Equals(b)a.CompareTo(b) == 0更清晰。 - Andrew Barber
1
真正的优势在于并非所有对象都提供CompareTo方法。Equals方法始终存在,因为它是由基类Object提供的。 - Cody Gray

6

CompareTo方法的功能实际上是Equals方法功能的超集。 CompareTo函数指定了排序顺序,之前、之后或相等,而Equals函数仅指定相等性。因此,实际上可以通过CompareTo来定义Equals

public bool Equals(string other) {
  return 0 == CompareTo(other);
}

2
虽然通常如此,但这并非总是如此。一个典型的例子是,在CompareTo()仅检查对象的名称以确定排序顺序时,Equals()可能也会检查其他字段。从[MSDN](http://msdn.microsoft.com/en-us/library/system.icomparable(v=vs.110).aspx)中获得:“此当前实例在排序顺序中与由CompareTo方法指定的对象处于相同的位置。” - 它并没有说对象相等。 - larsmoa

5

Equals方法用来比较两个对象是否相等,返回一个布尔值。

CompareTo方法返回一个整数,如果当前对象小于要比较的对象则返回-1(或者其他负数),如果两个对象相等则返回0,如果当前对象大于要比较的对象则返回1(或者其他正数)。这个方法常用于排序算法。


1

相等性比较比大小比较更加“挑剔”,但反之不成立。CompareTo 可以说“所有对象都是相等的”,而 Equals 则表示“但有些对象比其他对象更相等!”

一个例子是 System.String。String 的 Equals 方法和 == 运算符使用序数比较,即比较每个字符的 Unicode 码点值。然而,它的 CompareTo 方法使用了一个不那么挑剔、依赖于文化的比较。例如,在大多数计算机上,字符串“ṻ”和“ǖ”在 Equals 中是不同的,但在 CompareTo 中是相同的。

这段内容来自 C# in a nutshell


-2

CompareTo方法是将对象实例与String对象参数进行比较。 Equals方法确定两者的值是否相同。

当您比较两个对象的值时,应使用CompareTo方法。

String str1 = "abc";
String str2 = "def"
if(strq.CompareTo(str2) //

当一个或两个值不是对象时,应使用等号。

string str1 = "abc";
if(str1.Equals("abc") //

如果您对普通值类型变量使用CompareTo方法,它将使用类型转换(装箱),这是不必要的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接