Скажем, у меня есть 2 строки. Первая строка: x = "abc", а вторая - y = "ABC". Когда я пишу в С# следующий код:
if(x == y)
или
if(x.Equals(y))
Значение true. Как проверить верхний и нижний регистр?
Скажем, у меня есть 2 строки. Первая строка: x = "abc", а вторая - y = "ABC". Когда я пишу в С# следующий код:
if(x == y)
или
if(x.Equals(y))
Значение true. Как проверить верхний и нижний регистр?
Возвращаемое значение не true
, а false
, так как .NET чувствителен к регистру по умолчанию.
Из String.Equals
:
Этот метод выполняет порядковый номер ( чувствительный к регистру и культура-нечувствительность).
Для ==
то же самое верно, поскольку String.Equality
operator вызывает Equals
:
Этот оператор реализуется с использованием метода Equals, что означает Сравнение тестируется на комбинацию ссылок и значений равенство. Этот оператор выполняет сравнение по порядку.
Это будет случайным образом сравнивать регистр:
bool equals = x.Equals(y , StringComparison.OrdinalIgnoreCase);
Если вы просто хотите знать, является ли символ верхним или нижним регистром, вы можете использовать эти методы:
bool isUpperChar = Char.IsUpper("ABC"[0]); // yes
bool isLowerChar = Char.IsLower("ABC"[0]); // no
Во-первых, вы должны решить, сравниваете ли вы строки в culture dependent
или независимо друг от друга (например, в письмах русской культуры "E" и "Ё" часто рассматривается как одно и то же: финский язык относится к "V" и "W", как те же и т.д.). Затем вы должны выбрать, использовать или не использовать случай ( "a" v. "A" ). Таким образом, существует 6 возможных сравнений:
Сравнительные сравнения (культура):
// Ignore case comparison
Boolean equals = String.Equals(x, y, StringComparison.OrdinalIgnoreCase);
// Case comparison
Boolean equals = String.Equals(x, y, StringComparison.Ordinal);
Сравнение текущей культуры:
// Current culture, ignore case comparison
Boolean equals = String.Equals(x, y, StringComparison.CurrentCulture);
// Current culture, case comparison
Boolean equals = String.Equals(x, y, StringComparison.CurrentCultureIgnoreCase);
Явные сравнения культур:
CultureInfo culture = new CultureInfo("Ru-ru"); // <- Or whatever you want
// Explicit culture, ignore case comparison
Boolean equals = culture.CompareInfo.Compare(x, y, CompareOptions.IgnoreCase);
// Explicit culture, case comparison
Boolean equals = culture.CompareInfo.Compare(x, y, CompareOptions.None);
Это еще один вариант, который вы можете попробовать.
if(string.Compare("a", "A", true) == 0)
Try:
С учетом регистра:
String.Equals (a,b)
Нечувствительность к регистру
string.Equals(a, b, StringComparison.CurrentCultureIgnoreCase);
Как писал Плейн, или вы можете
StringComparer.CurrentCultureIgnoreCase.Equals(a, b)
Обратите внимание, что мы используем метод упорядочения CurrentCulture
. Иногда вам придется использовать разные методы упорядочения (каждый язык заказывает буквы по-другому)
Если вы уверены, что заказываете только символы ASCII, то
StringComparer.OrdinalIgnoreCase.Equals(a, b)
немного быстрее (или вообще методы, где вы можете выбрать OrdinalIgnoreCase
)
В общем преобразовании ToUpper()
или ToLower()
две строки для их сравнения неправильные (и медленные, потому что вы должны их полностью преобразовать, прежде чем сравнивать их, хотя, возможно, они отличаются в первом характер)... Неправильно, потому что на турецком языке есть четыре i
http://codeblog.jonskeet.uk/2009/11/02/omg-ponies-aka-humanity-epic-fail/