2010-02-11 17 views
14

Siempre asumí que .Net compara cadenas lexicográficamente, de acuerdo con la cultura actual. Pero hay algo extraño cuando una de las cadenas termina en '-':Comparación de cadenas en .Net: "+" vs "-"

"+".CompareTo("-") 
Returns: 1 

"+1".CompareTo("-1") 
Returns: -1 

lo consigo una todas las culturas que he probado, incluyendo el invariante. ¿Alguien puede explicar lo que está sucediendo y cómo puedo obtener el ordenamiento consistente carácter por carácter para la configuración regional actual?

+0

Lo mismo para '" x + ". CompareTo (" x - ")' y '" x + 1 ".CompareTo (" x-1 ")' –

Respuesta

7

No hay necesariamente una constante carácter por carácter pedido para cualquier lugar en particular.

Desde el MSDN documentation:

Por ejemplo, una cultura podría especificar que ciertas combinaciones de caracteres ser tratados como un solo carácter o caracteres en mayúsculas y minúsculas pueden comparar de una manera particular, o que el el orden de clasificación de un carácter depende de los caracteres que lo preceden o lo siguen.

La única manera de garantizar el orden consistente carácter por carácter es mediante el uso de una comparación ordinal, como se muestra en Anton's answer.

+0

Esto explica el asunto. Lo único que me pregunto es por qué tienen que introducir un tratamiento mágico para personajes de uso múltiple como ASCII minus. – jmster

+0

@jmster: Supongo que los caracteres '+' y '-' en realidad no significan nada en forma aislada, por lo que en esa situación se lleva a cabo una comparación ordinal donde' + '(código 43) se evalúa como" menor que "' -' (código 45). Sin embargo, cuando los caracteres '+' y '-' anteponen un número, adquieren un significado, y en esa situación tiene lugar una comparación" semántica "y/o numérica donde' + 1' es mayor que '-1'. – LukeH

+0

En realidad es todo lo contrario, .NET utiliza el orden ASCII para concluir que "+1" es menor que "-1", pero en la posición final menos mágicamente se convierte en guión, por lo que "-" se ordena en algún lugar entre "\ a "(campana) y" "(espacio en blanco). – jmster

10

trate de cambiar esto a

string.Compare("+", "-", StringComparison.Ordinal); // == -2 
string.Compare("+1", "-1", StringComparison.Ordinal); // == -2 
+1

Gracias Anton, pero Ordinal significa el viejo y bueno ASCII, con todas las mayúsculas van antes que minúsculas. string.Compare ("a", "Z", StringComparison.Ordinal); En mi localidad, el orden de las mayúsculas y minúsculas es algo así como 'a' <'A' <'ä' <'Ä' <... <'z' <'Z', pero veo ahora para acceder a ella directamente – jmster

+0

jmster: ¿Por qué no escribir su propio tipo? ¿Estás preocupado por los números? –

+0

He escrito mi propio método, pero en la parte inferior necesito alguna forma de comparar los caracteres de acuerdo con las reglas locales. Y no quiero codificar las configuraciones regionales a mano, debería ser posible obtenerlo desde Windows – jmster

3
 string.Compare("+", "-"); 
     string.Compare("+", "-", StringComparison.CurrentCulture); 
     string.Compare("+", "-", StringComparison.InvariantCulture); 
     string.Compare("+", "-", StringComparison.InvariantCultureIgnoreCase); 

     // All Pass 

los dos valor son iguales porque, carcasa inguisitic está siendo tomado en consideración

FIX:

reemplazar la comparación invariante con un comparison.This ordinales significa las decisiones se basan en comparaciones de bytes simples e ignoran las tablas de casing o equivalencias que se parametrizan por cultura.

referencia: Use ordinal StringComparison

string.Compare ("+", "-", StringComparison.Ordinal); // falla

0

usa CompareOrdinal. por ejemplo

String.CompareOrdinal("+1","-1"); 
-2 
String.CompareOrdinal("+","-"); 
-2 
2

Es probable que desee utilizar el verdadero signo menos, punto de código Unicode \ u2212. El signo menos que utiliza en la programación (\ u002d) es un "guión negativo", su orden de intercalación es sensible al contexto porque también se utiliza con frecuencia como guión. Hay más de lo que querrá saber sobre los diferentes tipos de guiones en this article.

+1

Su observación es absolutamente correcta, las personas Unicode parecen saber mejor cómo se debe usar cada personaje. Es culpa de los usuarios que no recuerden los números Unicode y usen los caracteres que ven en el teclado. – jmster

+0

La tipografía y los lenguajes de programación siguen siendo un mundo aparte. Tal vez eso cambie algún día, llevará un tiempo. Hay muchos accesos directos Alt + teclado disponibles para ingresar este tipo de puntos de código Unicode, irónicamente, no para el signo menos. –