Чувствительны ли к регистру строковые операции .NET?

Чувствительны ли к регистру строковые функции .NET, такие как IndexOf("blah")?

Насколько я помню, это не так, но по какой-то причине я вижу ошибки в своем приложении, где текст в строке запроса указан в верблюжьем регистре (например, UserID), и я тестирую IndexOf("userid").


person mrblah    schedule 01.09.2009    source источник


Ответы (4)


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

string blaBlah = "blaBlah";
int idx = blaBlah.IndexOf("blah", StringComparison.OrdinalIgnoreCase);
person driis    schedule 01.09.2009
comment
C# строго чувствителен к регистру, но в VB.NET вы можете использовать OPTION COMPARE TEXT для принудительного сравнения без учета регистра. По умолчанию в VB.NET используется BINARY, поэтому он ведет себя как C#. - person Pierre-Alain Vigeant; 02.09.2009
comment
Тем не менее, Option Compare применяется только к операторам сравнения VB, таким как = и Like, и не влияет ни на методы String, ни на другие строковые функции FCL. - person Pavel Minaev; 02.09.2009

Одна вещь, которую я хотел бы добавить к существующим ответам (поскольку вы изначально спрашивали об ASP.NET):

Некоторые наборы имен/значений, такие как Request.QueryString и, возможно, Request.Form, не чувствительны к регистру. Например, если я перейду на страницу ASPX, используя следующий URL-адрес

http://server/mypage.aspx?user=admin

то обе следующие строки вернут «admin»:

var user1 = Request.QueryString["user"];
var user2 = Request.QueryString["USER"];
person M4N    schedule 01.09.2009

Сравнение строк .NET действительно чувствительно к регистру. Вы можете использовать такие вещи, как ToUpper(), чтобы нормализовать вещи перед их сравнением.

person Jim Blake    schedule 01.09.2009
comment
Другой вариант: CultureInfo.CurrentCulture.CompareInfo.IndexOf(источник, значение, CompareOptions.IgnoreCase) - person Marcel Jackwerth; 02.09.2009
comment
Будьте осторожны с культурами, иначе вы можете внезапно обнаружить, что сравнение не работает в турецкой системе - в турецком языке i прописными буквами для İ. - person Michael Madsen; 02.09.2009
comment
использование либо ToUpper, либо ToLower - плохая идея, так как это потребует инициализации нового объекта (плохо для производительности) все методы сравнения строк либо принимают аргумент StringComparison, либо аргумент IComparer в одной из перегрузок, использующих один из них, будет выполнять ToUpper/ Снизить - person Rune FS; 02.09.2009

По умолчанию они чувствительны к регистру, но большинство из них (если не все), включая IndexOf, имеют перегрузку, которая принимает аргумент StringComparison. Например. если вы пройдете

StringComparison.InvariantCultureIgnoreCase 

в качестве аргумента StringComparison для IndexOf он будет (как следует из названия) игнорировать регистровые различия

person Rune FS    schedule 01.09.2009