Сравнение двух строк, игнорируя регистр в c# [дубликат]

Возможные Дубликаты:
в чем разница между различными методами сравнения строк

какой из двух эффективнее? (Или, может быть, есть третий вариант, который еще лучше?)

string val = "AStringValue";

if (val.Equals("astringvalue", StringComparison.InvariantCultureIgnoreCase))

или

if (val.ToLowerCase() == "astringvalue")

?

8 ответов


первый-правильный, а IMHO-более эффективный, так как второе "решение" создает экземпляр новой строки.


Если вы ищете эффективность, используйте этот:

string.Equals(val, "astringvalue", StringComparison.OrdinalIgnoreCase)

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

ToLowerCase может быть лучшим вариантом, если вы делаете много сравнений с той же строкой.

Как и при любой оптимизации производительности: измерить его, а потом решить!


на .ToLowerCase версия не будет быстрее - она включает в себя дополнительное распределение строк (которые позже должны быть собраны) и т. д.

лично я использую

string.Equals(val, "astringvalue",  StringComparison.OrdinalIgnoreCase)

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

С помощью string.Equals статический метод позволяет избежать каких-либо проблем с val будучи null.


мой общий ответ на этот вопрос об "эффективности" почти всегда, который когда-либо версия кода является наиболее читаемой, является наиболее эффективным.

это, как говорится, Я думаю (val.ToLowerCase() == "astringvalue") довольно понятно с первого взгляда большинством людей.

эффективность ссылаюсь на не necesseraly во исполнение кодекса, а в maintanance и вообще читаемость кода в вопрос.


Я бы рискнул, что безопаснее всего использовать String.Equals чтобы смягчить вероятность того, что val null.


первый самый быстрый. Оказывается, что val является неизменяемым, и поэтому новый объект string создается со строкой.ToLowerCase (), а не просто прямое сравнение со строковым компаратором. Создание нового строкового объекта может быть дорогостоящим, если вы делаете это много раз в секунду.


вы также можете посмотреть на этот уже ответивший вопрос различия в методах сравнения строк в C#


1st более эффективен (и лучший возможный вариант), потому что val.ToLowerCase() создает новый объект, так как строки являются неизменными.