Подтвердить что ты не робот

Почему 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 терпит неудачу. Идеи?

4b9b3361

Ответ 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, если какая-либо запись будет существовать.