2009-02-02 6 views
13

Digamos que tengo dos cadenas: a y b. Para comparar si un ser y tener los mismos valores cuando se ignora caso, yo siempre he utilizado:Combinando cadenas sin problemas en C#

// (Assume a and b have been verified not to be null) 

if (a.ToLower() == b.ToLower()) 

Sin embargo, el uso de reflector, lo he visto un par de veces en el .NET Framework:

// (arg three is ignoreCase) 

if (string.Compare(a, b, true) == 0) 

Probé que es más rápido, y el ToLower() venció Compare() cada vez con las cuerdas que utilicé.

¿Hay alguna razón para Compare() en lugar de ToLower()? Algo sobre diferentes CultureInfo? Me estoy rascando la cabeza.

Respuesta

7

La sección Observaciones del MSDN article debe explicar las cosas.Básicamente, la razón es la compatibilidad en diferentes configuraciones de culturas.

0

ToLower() no es una función de comparación, pone la cadena en minúsculas. Cuando el operador == se usa en objetos String en C#, el compilador lo optimiza. En el núcleo, ambos dependen de System.String.Equals como se ve en Reflector.

+0

Quiso decir que el ejemplo ToLower() superó el ejemplo (explícito) Compare(). – strager

+0

@Chris, la internacionalización puede desempeñar un papel en esto. – strager

+0

Bien, entonces string.Compare (a.ToLower(), b.ToLower()) parece ser más rápido que string.Compare (a, b, true) a continuación. – core

22

Lo principal que debe estar preocupado por no es el rendimiento, es correcto, ya partir de ese aspecto del método que probablemente quieren estar usando para un caso comparación insensible es o bien:

string.Compare(a, b, StringComparison.OrdinalIgnoreCase) == 0; 

o

a.Equals(b, StringComparison.OrdinalIgnoreCase) 

(el primero es útil si se sabe las cuerdas pueden ser nulo;. el último es más simple de escribir si ya se sabe que al menos una cadena es no nulo que nunca he probado el rendimiento, pero asumir que lo hará ser similar.)

Ordinal o OrdinalIgnoreCase son una apuesta segura a menos que sepa que desea utilizar otro método de comparación; para obtener la información necesaria para tomar la decisión read this article on MSDN.

+0

+1 aquí - el rendimiento simplemente no importa. Y si llega a un punto en el que utilizar un método de comparación de cadenas ligeramente menos esté causando problemas de rendimiento, debe replantearse su enfoque. –

+0

Microsoft recomienda no usar string.Compare() para buscar la ecualización. Hay una cadena equivalente. Iguales() que manejarán las verificaciones nulas. Recomendaría string.Equals (a, b, StringComparison.OrdianlIgnoreCase); – JSwartzen

3

Al comparar cadenas debe siempre utilizar un miembro explícito de StringComparison. Las funciones de cadena son algo inconsistentes en cómo eligen comparar cadenas. La única forma de garantizar la comparación utilizada es a) memorizarlos a todos (esto incluye tanto a usted como a todos los miembros de su equipo) ob) usar una comparación explícita para cada función.

Es mucho mejor ser explícito y no confiar en que el conocimiento del grupo sea perfecto. Tus compañeros de equipo te agradecerán por esto.

Ejemplo:

if (StringComparison.OrdinalIgnoreCase.Equals(a,b)) 

Usando ToLower para la comparación tiene 2 problemas que puedo pensar en la parte superior de mi cabeza

  1. Se asigna memoria. Las funciones de comparación no deben asignar memoria a menos que sea absolutamente necesario.
  2. Las cuerdas se pueden bajar de varias maneras. Lo más notable es Ordinal o Cultura Sensible más bajo. ¿De qué manera funciona .ToLower()? Personalmente, no sé. Es mucho mejor pasar una cultura explícita que confiar en el valor predeterminado.
+1

Eso no se compila. quisiste decir: 'String.Equals (a, b, StringComparison.OrdinalIgnoreCase.Equals)'? –

0

Podría su cargo el examen que muestra llamando ToLower() es más rápido que una entre mayúsculas y minúsculas ¿comparación? ¡Mis pruebas muestran lo contrario para ser verdad! De todos modos, los puntos de otros carteles sobre la corrección se mantienen.