Почему String.Equals возвращает false?
У меня есть следующий код С# (из библиотеки, которую я использую), которая пытается найти сертификат, сравнивающий отпечаток. Обратите внимание, что в следующем коде обе строки 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.
![enter image description here]()
Я мог бы пропустить что-то очевидное, но я не могу понять, почему метод Equals
терпит неудачу. Идеи?
Ответы
Ответ 1
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
, Объединение Grapheme Joiner.)
![Debug mode]()
Таким образом, результат сравнения не является хорошим показателем ошибки в Equals. Наиболее вероятной причиной вашей проблемы являются скрытые символы. Вы можете проверить длину, чтобы быть уверенным.
Для получения дополнительной информации см. .
Ответ 2
Возможно, вы захотите попробовать использовать перегрузку String.Equals
, которая принимает параметр типа StringComparison
.
Например:
myCert.Thumbprint.Equals(certificateThumbprint, StringComparison.[SomeEnumeration])
Где [SomeEnumeration]
заменяется одной из следующих перечислимых констант:
- CurrentCulture
- CurrentCultureIgnoreCase
- InvariantCulture
- InvariantCultureIgnoreCase
- Ordinal
- OrdinalIgnoreCase
Ссылка на документацию MSDN найдено здесь.
![enter image description here]()
Ответ 3
Иногда, когда мы вставляем данные в базу данных, он хранит несколько пробелов, например "вопрос" . И когда вы попытаетесь сравнить его с "вопросом" , он вернет false. Поэтому мое предложение: проверьте значение в базе данных или используйте метод Trim().
В вашем случае попробуйте: mycert.Thumbprint!= null && & mycert.Thumbprint.trim(). равно (certificateThumbprint.trim())
Я думаю, что он вернет true, если какая-либо запись будет существовать.