2012-01-18 15 views
21

¿Cuál es la diferencia entre estas dos clases?Diferencia entre las clases System.StringComparer y System.StringComparison?

He usado System.StringComparer.OrdinalIgnoreCase() y System.StringComparison.OrdinalIgnoreCase() y ambos producen los mismos resultados. ¿Tienen alguna diferencia o ambas cosas igual?

+1

podría publicar su caso y los resultados esperados de cada uno. Me pregunto si está comparando == vs Iguales en términos de referencias vs valores – MethodMan

+0

'System.StringComparison.OrdinalIgnoreCase' es un valor enum, no un método. Entonces 'System.StringComparison.OrdinalIgnoreCase()' no compilaría. No estoy seguro de lo que realmente quiso decir. – AakashM

Respuesta

14

StringComparer es una Class que implementa las interfaces de comparación como IComparer, IEqualityComparer, IComparer<String>, de modo que pueda ser utilizado para comparar dos cadenas.

StringComparison es simplemente un Enum que puede pasar a ciertos métodos para indicar qué tipo de comparación desea. En ese caso, sospecho que el método subyacente usaría un StringComparer para hacer la comparación real.

cuándo utilizar cada

Cadena métodos específicos como String.Equals sólo acepta un valor StringComparison, así que eso es lo que se puede usar en este caso.

Utilizaría un StringComparer para los métodos que toman un comparador como parámetro, y se llaman en un contexto donde se compararán las cadenas. Por ejemplo, si has tenido una List<String>, y quería que Sort mencionados de forma sensible a las mayúsculas, se podría hacer:

myList.Sort(StringComparer.OrdinalIgnoreCase); 
3

La pregunta es: ¿por qué tener en un marco tanto de ellos?

La explicación es la siguiente:

  • StringComparison es:

Especifica la cultura, caso, y ordenar reglas para ser utilizado por ciertos sobrecargas de la String.Compare y String.Equals métodos

  • StringComparer es:

representa una operación de comparación de cadenas que utiliza caso concreto y reglas basadas en el cultivo o de comparación ordinal

notado una diferencia? En el segundo caso, en el caso de StringComparer hay una noción de string comparison operation, pero no string tipo.

De hecho, si nos fijamos en this se lee simplemente:

Algunos métodos que no son cadenas que tienen comparación de cadenas como una central de operaciones utilizar el tipo de StringComparer.

Un ejemplo, a partir del mismo enlace:

Array.BinarySearch(this.storedNames, name, StringComparer.Ordinal) 

utilizo StringComparer como una "base" comparación entre el contenido del tipo array referencia.

+0

Tu enlace no es inglés – Mubarek

+0

El enlace fue actualizado – StingyJack

+1

Excelente respuesta. Para hacerlo aún más claro: probablemente nunca deberías diseñar un método o clase donde tomes un StringComparison como entrada; en su lugar, debes tomar como StringComparer, ya que esto permitiría que los clientes de tu código pasen en su propio comparador personalizado si es necesario. El comparador es extensible, mientras que la comparación no lo es. –

Cuestiones relacionadas