C# 为什么String.Equals返回false?

C# 为什么String.Equals返回false?,c#,string,comparison,equality,C#,String,Comparison,Equality,我有以下C#代码(来自我正在使用的库),它试图找到一个比较指纹的证书。请注意,在下面的代码中,mycert.Thumbprint和certificateThumbprint都是字符串 var certificateThumbprint = AppSettings.CertificateThumbprint; var cert = myStore.Certificates.OfType<X509Certificate2>().FirstOrDefault( myc

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

var certificateThumbprint = AppSettings.CertificateThumbprint;

var cert =
    myStore.Certificates.OfType<X509Certificate2>().FirstOrDefault(
      mycert => 
      mycert.Thumbprint != null && mycert.Thumbprint.Equals(certificateThumbprint)
      );
var certificateThumbprint=AppSettings.certificateThumbprint;
var证书=
myStore.Certificates.OfType().FirstOrDefault(
迈西尔特=>
mycert.Thumbprint!=null&&mycert.Thumbprint.Equals(certificateThumbprint)
);
由于
mycert.thumbprint.Equals(certificateThumbprint)
false
即使字符串相等,也无法找到带有指纹的证书
mycert.Thumbprint==certificateThumbprint
也返回
false
,而
mycert.Thumbprint.CompareTo(certificateThumbprint)
返回0


我可能遗漏了一些明显的东西,但我无法理解
Equals
方法失败的原因。想法?

比较忽略某些字符:

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
,组合了Grapheme Joiner。)

所以CompareTo的结果并不是Equals中缺陷的良好指示器。问题最可能的原因是隐藏字符。你可以检查长度以确定


有关详细信息,请参阅。

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

例如:


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

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

请参考找到的MSDN文档。

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

在您的情况下,请尝试: 迈凯特,指纹!=null&&mycert.Thumbprint.trim().equals(certificateThumbprint.trim())


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

这可能是一个奇怪的问题。。。但是每根绳子的长度是一样的吗?(尝试查看其中是否有任何不可打印的字符)。从文档中:字符集包括可忽略的字符。CuffReTo方法在执行对文化敏感的比较时不考虑这些字符。例如,如果以下代码在.NET Framework 4或更高版本上运行,“animal”与“ani mal”(使用软连字符或U+00AD)的比较表明这两个字符串是等效的。@JonathonReinhart我的引用表明
CompareTo
从比较中排除可忽略的字符。这就是为什么
CompareTo
返回0。我想这就是vcsj的功能。请查看每个字符串的
.tocharray()
,并逐个字符进行比较。几乎可以肯定的是,两者之间存在着微妙的性格差异。如果字符串正在报告:字符串可能没有equal@PeterRitchie第一行代码读取
var certificateThumbprint=AppSettings.certificateThumbprint,这就是我的问题。解释了这个问题。还有你不喜欢点击n运行问题,OP已经有一个小时没有看到了。我尝试了
OrdinalingOrecase
,结果是一样的(即false)。事实上,我在
certificateThumbprint
字符串的开头有两个U+200E(从左到右标记)字符。删除该选项修复了问题。在所有答案中,这是正确的答案。还有一些评论也指出了正确的问题,包括与此问题的链接。我将把这标记为已接受的答案。希望我也能这样做,以便发表评论。
 - CurrentCulture
 - CurrentCultureIgnoreCase
 - InvariantCulture
 - InvariantCultureIgnoreCase
 - Ordinal
 - OrdinalIgnoreCase