2012-02-01 61 views

Respuesta

16

De MSDN:

string.CompareTo:

Compara esta instancia con un objeto especificado o cadena y devuelve una número entero que indica si esta instancia precede, sigue o aparece en la misma posición en el orden de clasificación que el objeto especificado o Cadena.

string.Equals:

determina si dos objetos String tienen el mismo valor.

En resumen, CompareTo se utiliza para la clasificación. Equals se usa para determinar la igualdad.

14

CompareTo() le dice que, y si, uno es mayor/menor que el otro, mientras que Equals() simplemente le dice si son valores equivalentes.

Si todo lo que quiere saber es "¿son los mismos valores", usa Equals(). Si lo que necesita saber también cómo se comparan, utilice 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 
} 

Por último, cabe destacar que no son estrictamente necesarias estas Equals() y CompareTo() métodos para los tipos primitivos como int, debido a que los operadores de comparación estándar están sobrecargados, por lo que podría hacer éstos:

//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 
} 

por último, se mencionan string en su pregunta. Equals() y CompareTo() funcionan como lo he descrito para string también. Hemos de tener en cuenta la 'comparación' que hace CompareTo() en cadenas se basa en la clasificación alfabética, por lo "abcdefg" < "z"

+0

thx! entonces, si solo queremos ver si son los mismos valores, el uso de Equals() superará al de CompareTo()? ¿Qué da el adv. de usar Equals? –

+2

Puede haber alguna pequeña diferencia en el rendimiento, supongo. Si solo necesitas saber la igualdad, sí; use 'Igual()'. También es más claro en su código verificar 'a.Equals (b)' que 'a.CompareTo (b) == 0' –

+1

La ventaja real es que los objetos no proporcionan un método' CompareTo'. 'Equals' siempre estará allí, como lo proporciona la clase base' Object'. –

4

Equals devolverá un booleano para la igualdad.

CompareTo devolverá un int, con -1 (o cualquier otro valor negativo) para "menor que", 0 para "igual" o 1 (o cualquier otro valor positivo) para "mayor que". Este método es útil para clasificar algoritmos.

5

La funcionalidad en CompareTo es en realidad un superconjunto de funcionalidad de Equals. Una función CompareTo dicta ordenar, antes, después o igual, mientras que la función Equals simplemente dicta igualdad. Por lo tanto, en realidad es posible definir Equals en términos de CompareTo

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

Aunque es un caso común, este no es siempre el caso. Un ejemplo típico es donde 'CompareTo()' solo verifica el nombre de un objeto para determinar el orden, mientras que 'Equals()' también puede verificar otros campos. Desde [MSDN] (http://msdn.microsoft.com/en-us/library/system.icomparable (v = vs.110) .aspx): "Esta instancia actual se produce en la misma posición en el orden de clasificación que el objeto especificado por el método CompareTo ". - No dice que el objeto es igual. – larsmoa

0

El método CompareTo está comparando la instancia del objeto con el parámetro del objeto String. El método igual determina el valor de ambos son iguales o no.

CompareTo se debe utilizar cuando se comparan los valores de dos objetos.

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

Iguales se deben utilizar cuando uno o ambos no son objetos.

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

Si utiliza el método CompareTo para las variables de tipo valor normal, se utilizará el tipo fundido (boxeo), que no es necesario.

0

La igualdad puede ser "más complicada" que la comparación, pero no al revés. CompareTo puede decir “Todos los objetos son iguales” es igual a mientras dice “pero algunos son más iguales que otros!”

Un ejemplo de esto se System.string. El método Equals de String y el operador == usan la comparación ordinal, que compara los valores de puntos Unicode de cada carácter. Su método CompareTo, sin embargo, usa una comparación cultural dependiente menos exigente. En la mayoría de las computadoras, por ejemplo, las cadenas "ṻ" y "ǖ" son diferentes según Igual, pero igual de acuerdo con CompareTo.

Esto es de C# in a nutshell

Cuestiones relacionadas