Сравнение строк - strA.ToLower () == strB.ToLower () или strA.Equals (strB, StringComparisonType)? - PullRequest
11 голосов
/ 02 ноября 2009

Согласно заголовку, какую практику сравнения строк вы используете и почему?

Ответы [ 3 ]

31 голосов
/ 02 ноября 2009

Вы не указали платформу, но я предполагаю .NET. Я настоятельно рекомендую вам использовать последнюю форму - потому что сравнение случаев не так просто, как вы могли ожидать. (Это также позволяет избежать создания дополнительных строк, но это другой вопрос.)

Например, что вы хотите, чтобы ваш код делал, когда он представлен "mail" и "MAIL", когда он работает в Турции? Если вы используете ToLower, он вернет false, и аналогично, если вы используете CurrentCultureIgnoreCase - но если вы используете InvariantCultureIgnoreCase, он вернет true. Вам нужно подумать об источнике данных и о том, чего вы пытаетесь достичь с его помощью.

См. рекомендации по использованию строк в MSDN для получения дополнительной информации и рекомендаций.

Помимо всего прочего, я бы сказал, что последний выражает ваши намерения более эффективно. На самом деле вас не интересуют строчные значения строк в нижнем регистре - вас интересует равенство в регистронезависимом способе - именно это выражает вторая форма .

7 голосов
/ 02 ноября 2009

Вызов Equals масштабируется лучше, поскольку это одна строковая операция вместо трех.

Вы получаете наилучшую производительность для сравнения без учета регистра с опцией StringComparison.OrdinalIgnoreCase. Однако, поскольку он не учитывает культурные различия, он не всегда дает желаемый результат.

Если вы хотите изменить регистр для сравнения, рекомендуется использовать ToUpper вместо ToLower. Некоторые экзотические буквы не преобразуются должным образом из верхнего в нижний регистр, но преобразование из нижнего в верхний регистр работает.

В большинстве случаев производительность не имеет решающего значения, поэтому вам следует использовать альтернативу, которая наиболее целесообразна в данной ситуации.

Вы не указали, какой язык вы используете, но из оператора == это выглядит как C #. Если вы используете VB, вам следует учитывать, что оператор = использует не оператор создания равенства класса строки, а собственную логику VB для сравнения, которая немного отличается.

0 голосов
/ 02 ноября 2009

Я чувствую себя лучше при использовании второго, чем первого. Потому что второй тип будет поддерживаться на всех языках, и его будет удобнее использовать.

...