I have the following C# code (from a library I'm using) that tries to find a certificate comparing the thumbprint. Notice that in the following code both mycert.Thumbprint
and certificateThumbprint
are strings.
var certificateThumbprint = AppSettings.CertificateThumbprint;
var cert =
myStore.Certificates.OfType<X509Certificate2>().FirstOrDefault(
mycert =>
mycert.Thumbprint != null && mycert.Thumbprint.Equals(certificateThumbprint)
);
This fails to find the certificate with the thumbprint because mycert.Thumbprint.Equals(certificateThumbprint)
is false
even when the strings are equal. mycert.Thumbprint == certificateThumbprint
also returns false
, while mycert.Thumbprint.CompareTo(certificateThumbprint)
returns 0.
I might be missing something obvious, but I can't figure out why the Equals
method is failing. Ideas?
CompareTo ignores certain characters:
(Here, the character added to
a
isU+034F
, Combining Grapheme Joiner.)So CompareTo's result is not a good indicator of a bug in Equals. The most likely reason of your problem is hidden characters. You can check the lengths to be sure.
See this for more info.
Sometimes when we insert data in database it stores some spaces like "question ". And when you will try to compare it with "question" it returns false. So my suggestion is: please check the value in database or use Trim() method.
In your case, please try: mycert.Thumbprint != null && mycert.Thumbprint.trim().equals(certificateThumbprint.trim())
I think it will return true if any record will exist.
You may wish to try using an overload of
String.Equals
that accepts a parameter of typeStringComparison
.For example:
Where
[SomeEnumeration]
is replaced with one of the following enumerated constants:Reference the MSDN Documentation found here.