为什么String.Equals返回false?

时间:2014-09-23 15:29:09

标签: c# string comparison equality

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

var certificateThumbprint = AppSettings.CertificateThumbprint;

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

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

enter image description here

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

3 个答案:

答案 0 :(得分:21)

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,结合字形连接符。)

Debug mode

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

有关详细信息,请参阅this

答案 1 :(得分:2)

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

例如:

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


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

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


参考找到的 here 的MSDN文档。 enter image description here

答案 2 :(得分:0)

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

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

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