Лучший способ сравнить две строки и их верхний и нижний регистр - программирование
Подтвердить что ты не робот

Лучший способ сравнить две строки и их верхний и нижний регистр

Скажем, у меня есть 2 строки. Первая строка: x = "abc", а вторая - y = "ABC". Когда я пишу в С# следующий код:

if(x == y)

или

if(x.Equals(y))

Значение true. Как проверить верхний и нижний регистр?

4b9b3361

Ответ 1

Возвращаемое значение не 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

Ответ 2

Во-первых, вы должны решить, сравниваете ли вы строки в 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);

Ответ 3

Это еще один вариант, который вы можете попробовать.

if(string.Compare("a", "A", true) == 0)

Ответ 4

Try:

С учетом регистра:

String.Equals (a,b)

Нечувствительность к регистру

string.Equals(a, b, StringComparison.CurrentCultureIgnoreCase);

Ответ 5

Как писал Плейн, или вы можете

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/