visual strings stringcomparison ejemplo comparetoignorecase c# string comparison equality

c# - strings - ¿Por qué String.Equals está devolviendo falso?



stringcomparison c# (3)

Tengo el siguiente código de C # (de la biblioteca que estoy usando) que intenta encontrar un certificado comparando la huella digital. Observe que en el siguiente código tanto mycert.Thumbprint como certificateThumbprint son cadenas.

var certificateThumbprint = AppSettings.CertificateThumbprint; var cert = myStore.Certificates.OfType<X509Certificate2>().FirstOrDefault( mycert => mycert.Thumbprint != null && mycert.Thumbprint.Equals(certificateThumbprint) );

Esto no logra encontrar el certificado con la huella digital porque mycert.Thumbprint.Equals(certificateThumbprint) es false incluso cuando las cadenas son iguales. mycert.Thumbprint == certificateThumbprint también devuelve false , mientras que mycert.Thumbprint.CompareTo(certificateThumbprint) devuelve 0.

Puede que me esté faltando algo obvio, pero no puedo entender por qué el método de Equals está fallando. Ideas?


A veces, cuando insertamos datos en la base de datos, almacena algunos espacios como "pregunta" . Y cuando intentes compararla con "pregunta" , devuelve falso. Así que mi sugerencia es: compruebe el valor en la base de datos o utilice el método Trim ().

En su caso, intente: mycert.Thumbprint! = Null && mycert.Thumbprint.trim (). Equals (certificateThumbprint.trim ())

Creo que volverá verdadero si existiera algún registro.


CompareTo ignora ciertos caracteres:

static void Main(string[] args) { var a = "asdas"+(char)847;//add a hidden character var b = "asdas"; Console.WriteLine(a.Equals(b)); //false Console.WriteLine(a.CompareTo(b)); //0 Console.WriteLine(a.Length); //6 Console.WriteLine(b.Length); //5 //watch window shows both a and b as "asdas" }

(Aquí, el carácter agregado a a es U+034F , Combining U+034F Joiner).

Entonces, el resultado de CompareTo no es un buen indicador de un error en Equals. La razón más probable de su problema son los caracteres ocultos. Puede comprobar las longitudes para estar seguro.

Vea this para más información.


Puede intentar usar una sobrecarga de String.Equals que acepte un parámetro de tipo StringComparison .

Por ejemplo:

myCert.Thumbprint.Equals(certificateThumbprint, StringComparison.[SomeEnumeration])


Donde [SomeEnumeration] se reemplaza con una de las siguientes constantes enumeradas:

- CurrentCulture - CurrentCultureIgnoreCase - InvariantCulture - InvariantCultureIgnoreCase - Ordinal - OrdinalIgnoreCase


Consulte la documentación de MSDN que se encuentra here .