Сравнение строки в C # довольно просто. На самом деле есть несколько способов сделать это. Я перечислил некоторые в блоке ниже. Что меня интересует, так это различия между ними и когда один должен использоваться над другими? Следует ли избегать любой ценой? Есть еще что я не перечислил?
string testString = "Test";
string anotherString = "Another";
if (testString.CompareTo(anotherString) == 0) {}
if (testString.Equals(anotherString)) {}
if (testString == anotherString) {}
(Примечание: в этом примере я ищу равенство, не меньше и не больше, но также не стесняйтесь комментировать)
c#
string
comparison
Craig
источник
источник
Ответы:
Вот правила работы этих функций:
stringValue.CompareTo(otherStringValue)
null
перед строкойCultureInfo.CurrentCulture.CompareInfo.Compare
, что означает, что он будет использовать сравнение, зависящее от культуры. Это может означать, чтоß
будет сравниваться равнымSS
в Германии, или аналогичнымstringValue.Equals(otherStringValue)
null
не считается равным чему-либоStringComparison
опцию, он будет использовать то, что выглядит как прямая проверка порядкового номера, т. е.ß
отличается отSS
любого языка или культурыstringValue == otherStringValue
stringValue.Equals()
.==
Оператор вызывает статическийEquals(string a, string b)
метод (который , в свою очередь , идет на внутренний ,EqualsHelper
чтобы сделать сравнение..Equals()
наnull
строке получаетnull
эталонное исключение, а на==
нет.Object.ReferenceEquals(stringValue, otherStringValue)
Просто проверяет, что ссылки одинаковы, т.е. это не просто две строки с одинаковым содержимым, вы сравниваете строковый объект с самим собой.
Обратите внимание, что с опциями выше, которые используют вызовы методов, есть перегрузки с большим количеством опций, чтобы указать, как сравнивать.
Мой совет, если вы просто хотите проверить на равенство - решите, хотите ли вы использовать сравнение с культурой или нет, а затем использовать
.CompareTo
или.Equals
, в зависимости от выбора.источник
String.Compare
?Из MSDN:
Они предлагают использовать
.Equals
вместо того, чтобы.CompareTo
искать только равенство. Я не уверен, есть ли разница между.Equals
и==
дляstring
класса. Иногда я буду использовать.Equals
илиObject.ReferenceEquals
вместо==
своих собственных классов, если кто-то придет позже и переопределит==
оператор для этого класса.источник
Если вам когда-нибудь интересно узнать о различиях в методах BCL, Reflector - ваш друг :-)
Я следую этим рекомендациям:
Точное совпадение: РЕДАКТИРОВАТЬ: Ранее я всегда использовал оператор == по принципу, согласно которому внутри Equals (строка, строка) используется оператор object == для сравнения ссылок на объекты, но кажется, что strA.Equals (strB) по-прежнему равен 1-11%. быстрее, чем string.Equals (strA, strB), strA == strB и string.CompareOrdinal (strA, strB). Я проверил цикл с помощью StopWatch как для внутренних, так и для не внутренних значений строки, с одинаковой / различной длиной строки и разными размерами (от 1 до 5 МБ).
Человекочитаемое соответствие (западные культуры, без учета регистра):
Человекочитаемое соответствие (все другие культуры, нечувствительный кейс / акцент / кана / и т. Д., Определенные CultureInfo):
Человекочитаемое соответствие с пользовательскими правилами (Все другие культуры):
источник
Как сказал Эд , CompareTo используется для сортировки.
Однако есть разница между .Equals и ==.
== разрешает по существу следующий код:
Простая причина в том, что следующее вызовет исключение:
И следующего не будет:
источник
Хорошее объяснение и рекомендации по проблемам сравнения строк можно найти в статье Новые рекомендации по использованию строк в Microsoft .NET 2.0, а также в Рекомендации по использованию строк в .NET Framework .
Каждый из упомянутых методов (и других) имеет определенное назначение. Основное различие между ними заключается в том, какой тип перечисления StringComparison они используют по умолчанию. Есть несколько вариантов:
Каждый из приведенных выше типов сравнения ориентирован на разные варианты использования:
Обратите внимание, что перечисление StringComparison, а также перегрузки для методов сравнения строк существуют с .NET 2.0.
Метод String.CompareTo (String)
На самом деле это тип безопасной реализации метода IComparable.CompareTo . Интерпретация по умолчанию: CurrentCulture.
Использование:
таким образом
Метод String.Compare
Статический член класса String, который имеет много перегрузок. Интерпретация по умолчанию: CurrentCulture.
Метод String.Equals
Переопределяется из класса Object и перегружается для обеспечения безопасности типов. Интерпретация по умолчанию: Порядковый. Заметь:
Класс StringComparer
Существует также другой способ сравнения строк, особенно с целью сортировки:
источник
Не то, чтобы производительность обычно имела значение в 99% случаев, когда вам нужно это делать, но если бы вам пришлось делать это в цикле несколько миллионов раз, я бы настоятельно рекомендовал использовать .Equals или ==, потому что, как только он находит символ это не совпадает, это выдает все как ложное, но если вы используете CompareTo, ему придется выяснить, какой символ меньше другого, что приведет к немного худшему времени производительности.
Если ваше приложение будет работать в разных странах, я рекомендую вам взглянуть на последствия CultureInfo и, возможно, использовать .Equals. Поскольку я действительно пишу приложения только для США (и мне все равно, если они не будут работать должным образом), я всегда просто использую ==.
источник
В формах, которые вы перечислили здесь, нет большой разницы между ними.
CompareTo
заканчивает тем, что вызываетCompareInfo
метод, который делает сравнение, используя текущую культуру;Equals
называется==
оператором.Если учесть перегрузки, то все становится иначе.
Compare
и==
может использовать только текущую культуру для сравнения строки.Equals
иString.Compare
может приниматьStringComparison
аргумент перечисления, который позволяет вам задавать сравнения без учета культуры или без учета регистра.String.Compare
Позволяет только указатьCultureInfo
и выполнить сравнение с использованием культуры, отличной от культуры по умолчанию.Я считаю, что из-за его универсальности я использую
String.Compare
больше, чем любой другой метод сравнения; это позволяет мне точно указать, что я хочу.источник
Одно большое отличие, которое следует отметить, - .Equals () сгенерирует исключение, если первая строка пуста, тогда как == не будет.
источник
источник
Использование .Equals также намного проще для чтения .
источник
с .Equals вы также получаете опции StringComparison. очень удобно для игнорирования дела и других вещей.
Кстати, это будет оцениваться как ложный
Поскольку == сравнивает значения a и b (которые являются указателями), это будет иметь значение true, только если указатели указывают на один и тот же объект в памяти. .Equals разыменовывает указатели и сравнивает значения, хранящиеся в указателях. a.Equals (б) будет верно здесь.
и если вы измените b на:
тогда a.Equals (b) ложно, но
было бы правдой
a.CompareTo (b) вызывает функцию CompareTo строки, которая сравнивает значения в указателях и возвращает <0, если значение, хранящееся в a, меньше значения, хранящегося в b, возвращает 0, если a.Equals (b) имеет значение true, и > 0 в противном случае. Тем не менее, это чувствительно к регистру, я думаю, что есть варианты для CompareTo, чтобы игнорировать регистр и тому подобное, но сейчас нет времени искать. Как уже говорили другие, это будет сделано для сортировки. Сравнение на равенство таким образом привело бы к ненужным накладным расходам.
Я уверен, что я пропускаю вещи, но я думаю, что этого должно быть достаточно, чтобы начать экспериментировать, если вам нужно больше деталей.
источник