2009-09-01 3 views
10

Строковые функции .NET, такие как IndexOf("blah") с учетом регистра?Являются ли .NET строковые операции чувствительными к регистру?

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

ответ

21

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

string blaBlah = "blaBlah"; 
int idx = blaBlah.IndexOf("blah", StringComparison.OrdinalIgnoreCase); 
+1

C# является stricly чувствительны к регистру, но в VB.NET, вы можете использовать OPTION COMPARE TEXT для принудительного сравнения, нечувствительного к регистру. Значение по умолчанию в VB.NET является BINARY, поэтому оно ведет себя как C#. –

+1

Несмотря на это, «Сравнение опций» применяется только к операторам сравнения VB, таким как '=' и 'Like' - это не повлияет на какие-либо методы' String' и любые другие функции строки FCL. –

1

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

+0

Другим вариантом будет: CultureInfo.CurrentCulture.CompareInfo.IndexOf (source, value, CompareOptions.IgnoreCase) –

+0

Будьте осторожны с культурами, или вы можете внезапно обнаружить, что сравнение не работает в турецкой системе - на турецком языке, i - верхние к ие. –

+3

с использованием либо ToUpper, либо ToLower - это плохая идея, поскольку для инициализации нового объекта (плохого для производительности) потребуется всякий метод сравнения строк, либо принимает аргумент StringComparison, либо аргумент IComparer в одной из перегрузок, при этом один из них выйдет из режима ToUpper /Понижать –

0

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

StringComparison.InvariantCultureIgnoreCase 

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

11

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

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

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

то оба из следующих строк будет возвращать «админ»:

var user1 = Request.QueryString["user"]; 
var user2 = Request.QueryString["USER"]; 
Смежные вопросы