Ответ 1
Первый является правильным, и IMHO более эффективным, так как второе "решение" создает экземпляр новой строки.
Возможный дубликат:
В чем разница между различными методами сравнения строк
Какое из следующих двух более эффективно? (Или, может быть, есть третий вариант, который еще лучше?)
string val = "AStringValue";
if (val.Equals("astringvalue", StringComparison.InvariantCultureIgnoreCase))
ИЛИ
if (val.ToLowerCase() == "astringvalue")
?
Первый является правильным, и IMHO более эффективным, так как второе "решение" создает экземпляр новой строки.
Если вы ищете эффективность, используйте это:
string.Equals(val, "astringvalue", StringComparison.OrdinalIgnoreCase)
Порядковые сравнения могут быть значительно быстрее, чем сопоставления с культурой.
ToLowerCase
может быть лучшим вариантом, если вы делаете много сравнений с одной и той же строкой.
Как и при любой оптимизации производительности: измерьте ее, затем решите!
Версия .ToLowerCase
не будет быстрее - она включает в себя дополнительное распределение строк
(которые впоследствии должны быть собраны) и т.д.
Лично я использовал
string.Equals(val, "astringvalue", StringComparison.OrdinalIgnoreCase)
это устраняет все проблемы чувствительных к культуре строк, но, как следствие, позволяет избежать всех проблем, связанных с культурой. Только вы знаете, что это нормально в вашем контексте.
Использование статического метода string.Equals
позволяет избежать проблем с val
null
.
Мой общий ответ на такой вопрос о "эффективности" почти всегда, когда любая версия кода является наиболее читаемой, является наиболее эффективной.
Считаю, что (val.ToLowerCase() == "astringvalue")
очень понятен с первого взгляда большинством людей.
Эффективность, о которой я говорю, не является необходимой при выполнении кода, а скорее в обслуживании и в целом читабельности рассматриваемого кода.
Я бы рискнул использовать String.Equals
, чтобы смягчить возможность того, что val null
.
Бывший быстрее. Оказывается, что val
является неизменным, поэтому новый строковый объект создается с помощью String.ToLowerCase(), а не просто прямое сравнение со строковым сопоставителем. Создание нового строкового объекта может быть дорогостоящим, если вы делаете это много раз в секунду.
вы также можете посмотреть, что уже ответил на вопрос Различия в методах сравнения строк в С#
1-й более эффективен (и самый лучший вариант), потому что val.ToLowerCase()
создает новый объект, поскольку строки являются неизменяемыми.