c# - 为什么 String.Equals 返回 false?

标签 c# string comparison equality

我有以下 C# 代码(来 self 正在使用的库)试图找到比较指纹的证书。请注意,在以下代码中,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 方法会失败。想法?

最佳答案

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,Combining Grapheme Joiner.)

Debug mode

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

参见 this了解更多信息。

关于c# - 为什么 String.Equals 返回 false?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25999031/

相关文章:

比较struct char元素(不知道怎么说)

c# javascript 按钮点击

c - sscanf 循环内出现意外结果

java - 使用嵌套循环进行字符串比较

c - 将两个二维数组传递给函数进行比较

string - JFlex 词法分析器。多行字符串

ffmpeg - 我可以使用 ffmpeg 将 JPEG 输出到内存流而不是文件吗?

c# - 从代码设置绑定(bind)在 xamarin.forms 应用程序中不起作用

c# - 提交应用程序设置更改

python - 通过正则表达式修改字符串列表