Duda con String::Compare

07/01/2004 - 05:41 por Ramiro Calderon Romero | Informe spam
Como están,

Tengo este codigo

class App
{
static void Main()
{
string a = "the fellowship of the ring";
string b = "The two towers";

int n = string.Compare(a,b,true);
int m = string.Compare(a,b,false);
Console.WriteLine("n={0}, m={1}",n,m);

}
}


Yo esperaria n = -1 (No tengo en cuenta el case) y m = 1 ('T' <
't' si tengo en cuenta el case). Sinembargo, obtengo n = m = -1)

Si pongo a = "a" y b="A" funciona perfectamente n=0 y m=-1
Si pongo a= "aa" y b="Ab" no tiene en cuenta que las mayúsculas van primero
que las minusculas.


Estoy haciendo algo mal o es un comportamiento esperado (y por cierto
extraño en String::Compare)??

Saludos

____________________
Ramiro Calderon Romero
rcrdev@hotmail.com







Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.507 / Virus Database: 304 - Release Date: 8/4/2003

Preguntas similare

Leer las respuestas

#1 Guillermo guille
07/01/2004 - 12:13 | Informe spam
hola,

En el segundo caso, eme es -1 porque:
't' es menor que 'T', recuerda que las minúsculas van antes que las mayúsculas.

En el primer caso, también -1 porque la 't' de two va después que la 'f'
fellowship

Creo que te has hecho un verdadero lio con el orden de los caracteres ASCII, en
las comparaciones las mayúsculas van después que las minúsculas...

Además, en el segundo caso que expones 'a' y 'A', si te fijas, la 'a' te la da
como menor que la 'A'.


Nos vemos.
Guillermo
P.S.
Si te parece últil mi sitio:
http://www.elguille.info/lonuevo/lo....htm#dic30
Microsoft VB MVP desde 1997
Te invito a mi sitio dedicado al VB y más...
http://www.elguille.info/
http://www.mundoprogramacion.com/
(puede que el correo usado sea anti-spam)


"Ramiro Calderon Romero" wrote in message
news:e9WD$
Como están,

Tengo este codigo

class App
{
static void Main()
{
string a = "the fellowship of the ring";
string b = "The two towers";

int n = string.Compare(a,b,true);
int m = string.Compare(a,b,false);
Console.WriteLine("n={0}, m={1}",n,m);

}
}


Yo esperaria n = -1 (No tengo en cuenta el case) y m = 1 ('T' <
't' si tengo en cuenta el case). Sinembargo, obtengo n = m = -1)

Si pongo a = "a" y b="A" funciona perfectamente n=0 y m=-1
Si pongo a= "aa" y b="Ab" no tiene en cuenta que las mayúsculas van primero
que las minusculas.


Estoy haciendo algo mal o es un comportamiento esperado (y por cierto
extraño en String::Compare)??

Saludos

____________________
Ramiro Calderon Romero








Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.507 / Virus Database: 304 - Release Date: 8/4/2003


Respuesta Responder a este mensaje
#2 BigSus
07/01/2004 - 12:53 | Informe spam
Buenos dias.

Estoy haciendo una clase para controlar la introducción de fechas en TextBox
y he encontrado algo muy extraño.
En el evento KeyPress realizo un bucle para buscar cuantas barras ("/")
contiene y el problema aparece si teniendo como texto "01/01/2004" y estando
seleccionado 2004, al pulsar una tecla para cambiar el año aparece un error
al ejecutar el bucle siguiente:

byte indice = 0;
...
...
while(indice<mTextBox.Lengh)
{
if ( mTextBox.Text.Substring(indice, 1) == "/" )
{
cuentabarras++;
}
indice ++;
}
...

cuando indice es 6 dice: (El índice y la longitud deben hacer referencia a
una ubicación en la cadena.)

En ese momento mTextBox.Lengh es igual a 10, por lo que es como si contase
el tamaño contando "01/01/2004", pero luego solo dejase manejar la cadena
con la selección eliminada "01/01/"

Lo he solucionado cambiando la condición del while a
(indice<mTextBox.Lengh - mTextBox.SelectionLength) y para esto me vale.

Creo que es una malfunción del TextBox.
Respuesta Responder a este mensaje
#3 Guillermo guille
07/01/2004 - 17:34 | Informe spam
creo que no es una mal función del TextBox.
Seguramente es fallo de tu código.
Algo haces en esas dos líneas con puntos suspensivos que cambia el contenido
del textbox...

Aparte de que ese código lo has escrito "de memoria", ya que "mTextBox.Lengh",
por ejemplo no es correcto, aunque supongo que querrías poner
mTextBox.Text.Length
Si pruebas ese mismo código (corregido) en un proyecto... funcionará bien.

¿Que más haces?

Nos vemos.
Guillermo
P.S.
Si te parece últil mi sitio:
http://www.elguille.info/lonuevo/lo....htm#dic30
Microsoft VB MVP desde 1997
Te invito a mi sitio dedicado al VB y más...
http://www.elguille.info/
http://www.mundoprogramacion.com/
(puede que el correo usado sea anti-spam)


"BigSus" wrote in message
news:
Buenos dias.

Estoy haciendo una clase para controlar la introducción de fechas en TextBox
y he encontrado algo muy extraño.
En el evento KeyPress realizo un bucle para buscar cuantas barras ("/")
contiene y el problema aparece si teniendo como texto "01/01/2004" y estando
seleccionado 2004, al pulsar una tecla para cambiar el año aparece un error
al ejecutar el bucle siguiente:

byte indice = 0;
...
...
while(indice<mTextBox.Lengh)
{
if ( mTextBox.Text.Substring(indice, 1) == "/" )
{
cuentabarras++;
}
indice ++;
}
...

cuando indice es 6 dice: (El índice y la longitud deben hacer referencia a
una ubicación en la cadena.)

En ese momento mTextBox.Lengh es igual a 10, por lo que es como si contase
el tamaño contando "01/01/2004", pero luego solo dejase manejar la cadena
con la selección eliminada "01/01/"

Lo he solucionado cambiando la condición del while a
(indice<mTextBox.Lengh - mTextBox.SelectionLength) y para esto me vale.

Creo que es una malfunción del TextBox.


Respuesta Responder a este mensaje
#4 Ramiro Calderon Romero
07/01/2004 - 20:40 | Informe spam
Hola Guille,
Según la tabla ascii,

A tiene el código 65 Hex (41)
a tiene el código 97 Hex (61)

Generalizando, el ascii de una letra mayuscula es 32 posiciones menor que su
equivalente minúscula.

De ahi mi duda.

Me estaba guiando por el ascii y String::CompareOrdinal fue la solución a mi
problema, ya que no depende de la cultura.
Supongo entonces que el parámetro ignoreCase en string::Compare solo aplica
para dirimir cadenas equivalentes que sólo difieran por el case.


De hecho, lo que queria era ordenar un vector de strings en orden
lexicográfico teniendo en cuenta el case,
Es muy aburridor haber hecho mi propia clase Comparer wrapper alrededor de
String::CompareOrdinal para eso.

Agradezco mucho tu ayuda.

Saludos,


____________________
Ramiro Calderon Romero





"Guillermo 'guille'" wrote in message
news:%
hola,

En el segundo caso, eme es -1 porque:
't' es menor que 'T', recuerda que las minúsculas van antes que las


mayúsculas.

En el primer caso, también -1 porque la 't' de two va después que la 'f'
fellowship

Creo que te has hecho un verdadero lio con el orden de los caracteres


ASCII, en
las comparaciones las mayúsculas van después que las minúsculas...

Además, en el segundo caso que expones 'a' y 'A', si te fijas, la 'a' te


la da
como menor que la 'A'.


Nos vemos.
Guillermo
P.S.
Si te parece últil mi sitio:
http://www.elguille.info/lonuevo/lo....htm#dic30
Microsoft VB MVP desde 1997
Te invito a mi sitio dedicado al VB y más...
http://www.elguille.info/
http://www.mundoprogramacion.com/
(puede que el correo usado sea anti-spam)


"Ramiro Calderon Romero" wrote in message
news:e9WD$
> Como están,
>
> Tengo este codigo
>
> class App
> {
> static void Main()
> {
> string a = "the fellowship of the ring";
> string b = "The two towers";
>
> int n = string.Compare(a,b,true);
> int m = string.Compare(a,b,false);
> Console.WriteLine("n={0}, m={1}",n,m);
>
> }
> }
>
>
> Yo esperaria n = -1 (No tengo en cuenta el case) y m = 1 ('T' <
> 't' si tengo en cuenta el case). Sinembargo, obtengo n = m = -1)
>
> Si pongo a = "a" y b="A" funciona perfectamente n=0 y m=-1
> Si pongo a= "aa" y b="Ab" no tiene en cuenta que las mayúsculas van


primero
> que las minusculas.
>
>
> Estoy haciendo algo mal o es un comportamiento esperado (y por cierto
> extraño en String::Compare)??
>
> Saludos
>
> ____________________
> Ramiro Calderon Romero
>
>
>
>
>
>
>
>
> Outgoing mail is certified Virus Free.
> Checked by AVG anti-virus system (http://www.grisoft.com).
> Version: 6.0.507 / Virus Database: 304 - Release Date: 8/4/2003
>
>







Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.507 / Virus Database: 304 - Release Date: 8/4/2003
Respuesta Responder a este mensaje
#5 BigSus
10/01/2004 - 01:48 | Informe spam
Gracias por contestar Guille, he vuelto a mirar el código y he descubierto
que estaba llamando a una función que me eliminaba la parte seleccionada, en
vez de usar mTextBox.Text.Lengh directamente lo metía en una variable y
cuando la selección era eliminada no modificaba la nueva longitud de la
cadena.



Todo solucionado, el otro día me estaba volviendo loco. Miraba y miraba y
acabé pensando que era un bug de .net



Un saludo





"Guillermo 'guille'" escribió en el mensaje
news:%
creo que no es una mal función del TextBox.
Seguramente es fallo de tu código.
Algo haces en esas dos líneas con puntos suspensivos que cambia el


contenido
del textbox...

Aparte de que ese código lo has escrito "de memoria", ya que


"mTextBox.Lengh",
por ejemplo no es correcto, aunque supongo que querrías poner
mTextBox.Text.Length
Si pruebas ese mismo código (corregido) en un proyecto... funcionará bien.

¿Que más haces?

Nos vemos.
Guillermo
P.S.
Si te parece últil mi sitio:
http://www.elguille.info/lonuevo/lo....htm#dic30
Microsoft VB MVP desde 1997
Te invito a mi sitio dedicado al VB y más...
http://www.elguille.info/
http://www.mundoprogramacion.com/
(puede que el correo usado sea anti-spam)


"BigSus" wrote in message
news:
> Buenos dias.
>
> Estoy haciendo una clase para controlar la introducción de fechas en


TextBox
> y he encontrado algo muy extraño.
> En el evento KeyPress realizo un bucle para buscar cuantas barras ("/")
> contiene y el problema aparece si teniendo como texto "01/01/2004" y


estando
> seleccionado 2004, al pulsar una tecla para cambiar el año aparece un


error
> al ejecutar el bucle siguiente:
>
> byte indice = 0;
> ...
> ...
> while(indice<mTextBox.Lengh)
> {
> if ( mTextBox.Text.Substring(indice, 1) == "/" )
> {
> cuentabarras++;
> }
> indice ++;
> }
> ...
>
> cuando indice es 6 dice: (El índice y la longitud deben hacer referencia


a
> una ubicación en la cadena.)
>
> En ese momento mTextBox.Lengh es igual a 10, por lo que es como si


contase
> el tamaño contando "01/01/2004", pero luego solo dejase manejar la


cadena
> con la selección eliminada "01/01/"
>
> Lo he solucionado cambiando la condición del while a
> (indice<mTextBox.Lengh - mTextBox.SelectionLength) y para esto me vale.
>
> Creo que es una malfunción del TextBox.
>
>


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida