为什么String.Equals返回false?

我有以下C#代码(来自我正在使用的库)试图找到比较指纹的证书。 请注意,在以下代码中, mycert.ThumbprintcertificateThumbprint都是字符串。

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

这无法找到带有指纹的证书,因为即使字符串相等, mycert.Thumbprint.Equals(certificateThumbprint)也为falsemycert.Thumbprint == certificateThumbprint也返回false ,而mycert.Thumbprint.CompareTo(certificateThumbprint)返回0。

在此处输入图像描述

我可能会遗漏一些明显的东西,但我无法弄清楚为什么Equals方法失败了。 想法?

CompareTo忽略某些字符:

 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" } 

(这里,添加到a的字符是U+034F ,结合U+034F Joiner。)

调试模式

因此,CompareTo的结果不是Equals中错误的良好指标。 您问题的最可能原因是隐藏的字符。 您可以检查长度以确定。

有关详细信息,请参阅此

您可能希望尝试使用String.Equals的重载来接受StringComparison类型的参数。

例如:

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

其中[SomeEnumeration]被以下枚举常量之一替换:

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

参考此处的MSDN文档。 在此处输入图像描述

有时,当我们在数据库中插入数据时,它会存储一些空格,如“问题” 。 当你试图将它与“问题”进行比较时,它会返回false。 所以我的建议是:请检查数据库中的值或使用Trim()方法。

在您的情况下,请尝试: mycert.Thumbprint!= null && mycert.Thumbprint.trim()。equals(certificateThumbprint.trim())

我认为如果存在任何记录,它将返回true。