C# 为什么String.Equals返回false?
我有以下C#代码(来自我正在使用的库),它试图找到一个比较指纹的证书。请注意,在下面的代码中,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
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