una - string.equals c#
Comparación de cadenas y orden alfabético de caracteres individuales (4)
Tengo una pregunta relacionada con la comparación de cadenas y la comparación de caracteres.
Los caracteres >
y 0
(cero) tienen los siguientes valores decimales 62
y 48
consecuencia.
Cuando comparo dos caracteres en el siguiente código, obtengo el valor True
(que es correcto)
Console.WriteLine(''>'' > ''0'');
Cuando comparo dos cadenas de un carácter en el siguiente código, obtengo el valor -1
que indica que ">" es menor que "0" (la cultura predeterminada es el inglés)
Console.WriteLine(string.Compare(">", "0"));
Mientras que la comparación de "3" y "1" (valores de código de 51
y 49
) en el siguiente código devuelve 1
(como se esperaba)
Console.WriteLine(string.Compare("3", "1"));
Además, la documentación de string.Compare(string str1, string str2)
dice:
La comparación utiliza la cultura actual para obtener información específica de la cultura, como las reglas de envoltura y el orden alfabético de los caracteres individuales
¿Podría explicar (o proporcionar referencia a alguna documentación) cómo se implementa la comparación de cadenas, por ejemplo, cómo se calcula el orden alfabético de los caracteres individuales, etc.?
Cuando comparas los caracteres ''>''
y ''0''
, estás comparando sus valores ordinales.
Para obtener el mismo comportamiento de una comparación de cadena, proporcione el tipo de comparación de cadena ordinal:
Console.WriteLine(string.Compare(">", "0", StringComparison.Ordinal));
Console.WriteLine(string.Compare(">", "0", StringComparison.InvariantCulture));
Console.WriteLine(string.Compare(">", "0", StringComparison.CurrentCulture));
La cultura actual se usa por defecto, que tiene un orden de clasificación destinado a ordenar las cadenas "alfabéticamente" en lugar de un orden estrictamente léxico, para alguna definición de alfabético.
El orden de las cadenas depende de la cultura que utilice.
StringComparer.CurrentCulture ordena las siguientes cadenas de 1 carácter de la siguiente manera en mi máquina:
'' - ! " # $ % & ( ) * , . / : ; ? @ [
/ ] ^ _ ` { | } ~ + < = > 0 1 2 3 4 5 6
7 8 9 a A b B c C d D e E f F g G h H i
I j J k K l L m M n N o O p P q Q r R s
S t T u U v V w W x X y Y z Z
StringComparer.Ordinal ordena las mismas cadenas de la siguiente manera:
! " # $ % & '' ( ) * + , - . / 0 1 2 3
4 5 6 7 8 9 : ; < = > ? @ A B C D E F G
H I J K L M N O P Q R S T U V W X Y Z [
/ ] ^ _ ` a b c d e f g h i j k l m n o
p q r s t u v w x y z { | } ~
Parece que lo que desea es la comparación para no usar reglas específicas de la cultura. ¿Has probado StringComparison.Ordinal?
Console.WriteLine( string.Compare( ">", "0", StringComparison.Ordinal ) ); // returns a positive number
devuelve -1
porque está comparando str2
con str1
, no al revés. Por ejemplo, "es 48 igual a 62". No, es menos de 62 por lo que devuelve -1. Es semánticamente un poco confuso cuando lees el orden de los parámetros