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 .