2014-09-23 6 views
23

У меня есть следующий код C# (из библиотеки, которую я использую), которая пытается найти сертификат, сравнивающий отпечаток. Обратите внимание, что в следующем коде и mycert.Thumbprint и certificateThumbprint являются строками.Почему String.Equals возвращает false?

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 не удается. Идеи?

+15

Это может быть странный вопрос ... но являются ли длины одинаковыми для каждой строки?(пытаясь увидеть, есть ли какие-либо непечатаемые символы там как-то). – vcsjones

+5

Из ['string.CompareTo'] (http://msdn.microsoft.com/en-us/library/fkw3h78a (v = vs.110) .aspx) docs: * Наборы символов ** включают невосприимчивые символы. * * Метод CompareTo не учитывает такие символы, когда он выполняет культурно-чувствительное сравнение. Например, если следующий код выполняется на .NET Framework 4 или более поздней версии, сравнение «животное» с «ani-mal» (с использованием мягкого дефиса или U + 00AD) указывает на то, что две строки эквивалентны. * –

+2

@Yuval Ваша цитата, похоже, подразумевает противоположность тому, что подозревает vcsjones. –

ответ

21

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, Объединение графем.)

Debug mode

Так результат CompareTo не является хорошим показателем ошибка в Equals. Наиболее вероятной причиной вашей проблемы являются скрытые символы. Вы можете проверить длину, чтобы быть уверенным.

См. this для получения дополнительной информации.

+0

Действительно, у меня были два символа U + 200E (слева направо) в начале строки 'certificateThumbprint'. Удаление этого исправлено. –

+0

Из всех ответов это правильно. Также есть комментарии, которые также указывают на правильную проблему, включая ссылку на этот вопрос http://stackoverflow.com/questions/11115511/how-to-find-certificate-by-its-thumbprint-in-c-sharp. Я отмечу это как принятый ответ. Жаль, что я тоже могу это сделать для комментариев. –

2

Возможно, вы захотите воспользоваться перегрузкой String.Equals, которая принимает параметр StringComparison.

Например:

myCert.Thumbprint.Equals(certificateThumbprint, StringComparison.[SomeEnumeration]) 


Где [SomeEnumeration] заменяется одним из следующих перечисленных констант:

- CurrentCulture 
- CurrentCultureIgnoreCase 
- InvariantCulture 
- InvariantCultureIgnoreCase 
- Ordinal 
- OrdinalIgnoreCase 


ссылочном документации MSDN нашел here. enter image description here

+0

Я пробовал с 'OrdinalIgnoreCase', и результат был тот же (т. Е. False). –

0

Иногда, когда мы вставки данных в базе данных он сохраняет некоторые пробелы, как «вопрос». И когда вы попытаетесь сравнить его с «вопрос», он возвращает false. Поэтому мое предложение: проверьте значение в базе данных или используйте метод Trim().

В вашем случае, пожалуйста, попробуйте: mycert.Thumbprint = нуль & & mycert.Thumbprint.trim() равно (certificateThumbprint.trim())

Я думаю, что это возвращает истину, если какая-то!. запись будет существовать.

Смежные вопросы