[英]Why String.Equals is returning false?
我有以下C#代碼(來自我正在使用的庫),試圖查找比較指紋的證書。 請注意,在以下代碼中, mycert.Thumbprint
和certificateThumbprint
都是字符串。
var certificateThumbprint = AppSettings.CertificateThumbprint;
var cert =
myStore.Certificates.OfType<X509Certificate2>().FirstOrDefault(
mycert =>
mycert.Thumbprint != null && mycert.Thumbprint.Equals(certificateThumbprint)
);
這無法找到帶有指紋的證書,因為即使字符串相等, mycert.Thumbprint.Equals(certificateThumbprint)
也為false
。 mycert.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
,組合字素連接。)
因此,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。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.