Сравнивая две строки, игнорируя регистр в С#

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

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

string val = "AStringValue";

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

ИЛИ

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

?

Ответ 1

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

Ответ 2

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

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

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

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

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

Ответ 3

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

Лично я использовал

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

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

Использование статического метода string.Equals позволяет избежать проблем с val null.

Ответ 4

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

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

Эффективность, о которой я говорю, не является необходимой при выполнении кода, а скорее в обслуживании и в целом читабельности рассматриваемого кода.

Ответ 5

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

Ответ 6

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

Ответ 8

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