Comparar cadenas en C # es bastante simple. De hecho, hay varias formas de hacerlo. He enumerado algunos en el bloque a continuación. Lo que me interesa son las diferencias entre ellos y cuándo se debe usar uno sobre los demás. ¿Se debe evitar a toda costa? ¿Hay más que no haya enumerado?
string testString = "Test";
string anotherString = "Another";
if (testString.CompareTo(anotherString) == 0) {}
if (testString.Equals(anotherString)) {}
if (testString == anotherString) {}
(Nota: estoy buscando igualdad en este ejemplo, no menor o mayor que, pero siéntase libre de comentar sobre eso también)
c#
string
comparison
Craig
fuente
fuente
Respuestas:
Aquí están las reglas sobre cómo funcionan estas funciones:
stringValue.CompareTo(otherStringValue)
null
viene antes de una cuerdaCultureInfo.CurrentCulture.CompareInfo.Compare
, lo que significa que usará una comparación dependiente de la cultura. Esto podría significar queß
se comparará igual queSS
en Alemania, o similarstringValue.Equals(otherStringValue)
null
no se considera igual a nadaStringComparison
opción, usará lo que parece una verificación de igualdad ordinal directa,ß
es decir, no es lo mismo queSS
, en cualquier idioma o culturastringValue == otherStringValue
stringValue.Equals()
.==
operador llama alEquals(string a, string b)
método estático (que a su vez va a un internoEqualsHelper
para hacer la comparación..Equals()
a unanull
cadena obtiene unanull
excepción de referencia, mientras que en==
no.Object.ReferenceEquals(stringValue, otherStringValue)
Simplemente verifica que las referencias sean las mismas, es decir, no son solo dos cadenas con el mismo contenido, estás comparando un objeto de cadena consigo mismo.
Tenga en cuenta que con las opciones anteriores que usan llamadas a métodos, hay sobrecargas con más opciones para especificar cómo comparar.
Mi consejo si solo desea verificar la igualdad es decidir si desea usar una comparación culturalmente dependiente o no, y luego usar
.CompareTo
o.Equals
, según la elección.fuente
String.Compare
?De MSDN:
Sugieren usar en
.Equals
lugar de.CompareTo
cuando se busca únicamente la igualdad. No estoy seguro de si hay una diferencia entre.Equals
y==
para lastring
clase. A veces usaré.Equals
o enObject.ReferenceEquals
lugar de==
para mis propias clases en caso de que alguien venga más tarde y redefina el==
operador para esa clase.fuente
Si alguna vez tiene curiosidad sobre las diferencias en los métodos BCL, Reflector es su amigo :-)
Sigo estas pautas:
Concordancia exacta: EDITAR: Anteriormente siempre usé == operador en el principio de que dentro de Igual (cadena, cadena) el objeto == operador se usa para comparar las referencias de objeto, pero parece que strA.Equals (strB) todavía es 1-11% más rápido en general que string.Equals (strA, strB), strA == strB y string.CompareOrdinal (strA, strB). Probé en bucle con un StopWatch en valores de cadena internados / no internados, con longitudes de cadena iguales / diferentes y tamaños variables (1B a 5MB).
Combinación legible por humanos (culturas occidentales, sin distinción entre mayúsculas y minúsculas):
Concordancia legible por humanos (todas las demás culturas, mayúsculas / minúsculas insensibles / kana / etc definidas por CultureInfo):
Combinación legible por humanos con reglas personalizadas (todas las demás culturas):
fuente
Como dijo Ed , CompareTo se usa para ordenar.
Sin embargo, hay una diferencia entre .Equals y ==.
== resuelve esencialmente el siguiente código:
La razón simple es que lo siguiente arrojará una excepción:
Y lo siguiente no lo hará:
fuente
Se pueden encontrar buenas explicaciones y prácticas sobre problemas de comparación de cadenas en el artículo Nuevas recomendaciones para usar cadenas en Microsoft .NET 2.0 y también en Mejores prácticas para usar cadenas en .NET Framework .
Cada uno de los métodos mencionados (y otros) tiene un propósito particular. La diferencia clave entre ellos es qué tipo de Enumeración de comparación de cadenas están utilizando de forma predeterminada. Hay varias opciones:
Cada uno de los tipos de comparación anteriores apunta a un caso de uso diferente:
Tenga en cuenta que la enumeración de comparación de cadenas, así como las sobrecargas para los métodos de comparación de cadenas, existe desde .NET 2.0.
Método String.CompareTo (String)
De hecho, es una implementación segura del método IComparable.CompareTo . Interpretación predeterminada: CurrentCulture.
Uso:
Así
Método de comparación de cadenas
Un miembro estático de String Class que tiene muchas sobrecargas. Interpretación predeterminada: CurrentCulture.
Método String.Equals
Anulado de la clase Object y sobrecargado por seguridad de tipo. Interpretación predeterminada: ordinal. Darse cuenta de:
Clase StringComparer
También hay otra forma de lidiar con las comparaciones de cadenas, especialmente con el objetivo de ordenar:
fuente
No es que el rendimiento generalmente importe con el 99% de las veces que necesitas hacer esto, pero si tuvieras que hacerlo en un bucle varios millones de veces, te sugiero que uses .Equals o == porque tan pronto como encuentre un personaje eso no coincide, arroja todo como falso, pero si usa CompareTo, tendrá que descubrir qué personaje es menor que el otro, lo que lleva a un tiempo de rendimiento ligeramente peor.
Si su aplicación se ejecutará en diferentes países, le recomiendo que eche un vistazo a las implicaciones de CultureInfo y posiblemente use .Equals. Como solo escribo aplicaciones para EE. UU. (Y no me importa si alguien no funciona correctamente), siempre uso ==.
fuente
En los formularios que enumeró aquí, no hay mucha diferencia entre los dos.
CompareTo
termina llamando a unCompareInfo
método que hace una comparación usando la cultura actual;Equals
es llamado por el==
operador.Si considera sobrecargas, entonces las cosas se ponen diferentes.
Compare
y==
solo puede usar la cultura actual para comparar una cadena.Equals
yString.Compare
puede tomar unStringComparison
argumento de enumeración que le permite especificar comparaciones insensibles a la cultura o mayúsculas y minúsculas. Solo leString.Compare
permite especificar ayCultureInfo
realizar comparaciones utilizando una cultura distinta de la cultura predeterminada.Debido a su versatilidad, encuentro que uso
String.Compare
más que cualquier otro método de comparación; me permite especificar exactamente lo que quiero.fuente
Una gran diferencia a tener en cuenta es .Equals () arrojará una excepción si la primera cadena es nula, mientras que == no lo hará.
fuente
fuente
Usar .Equals también es mucho más fácil de leer .
fuente
con .Equals, también obtienes las opciones de StringComparison. Muy útil para ignorar el caso y otras cosas.
por cierto, esto se evaluará como falso
Como == compara los valores de a y b (que son punteros), esto solo se evaluará como verdadero si los punteros apuntan al mismo objeto en la memoria. .Equals desreferencia los punteros y compara los valores almacenados en los punteros. a. Igual (b) sería cierto aquí.
y si cambia b a:
entonces a.Equals (b) es falso, pero
seria verdad
a.CompareTo (b) llama a la función CompareTo de la cadena que compara los valores en los punteros y devuelve <0 si el valor almacenado en a es menor que el valor almacenado en b, devuelve 0 si a.Equals (b) es verdadero y > 0 de lo contrario. Sin embargo, esto distingue entre mayúsculas y minúsculas, creo que posiblemente haya opciones para que CompareTo ignore mayúsculas y minúsculas, pero no tengo tiempo para mirar ahora. Como ya han dicho otros, esto se haría para clasificar. Comparar la igualdad de esta manera resultaría en una sobrecarga innecesaria.
Estoy seguro de que estoy dejando de lado las cosas, pero creo que esto debería ser suficiente información para comenzar a experimentar si necesita más detalles.
fuente