Как я могу провести сравнение строк без учета регистра?
Как сделать строку ниже регистрозависимой?
drUser["Enrolled"] =
(enrolledUsers.FindIndex(x => x.Username == (string)drUser["Username"]) != -1);
Мне сегодня был дано совет, который предложил использовать:
x.Username.Equals((string)drUser["Username"], StringComparison.OrdinalIgnoreCase)));
Проблема в том, что я не могу заставить это работать, я пробовал строку ниже, это компилирует, но возвращает неправильные результаты, он возвращает зарегистрированных пользователей как незарегистрированных и незарегистрированных пользователей в качестве зарегистрированных.
drUser["Enrolled"] =
(enrolledUsers.FindIndex(x => x.Username.Equals((string)drUser["Username"],
StringComparison.OrdinalIgnoreCase)));
Может ли кто-нибудь указать на проблему?
Ответы
Ответ 1
Это не лучшая практика в .NET framework (4 и +) для проверки равенства
String.Compare(x.Username, (string)drUser["Username"],
StringComparison.OrdinalIgnoreCase) == 0
Используйте вместо этого
String.Equals(x.Username, (string)drUser["Username"],
StringComparison.OrdinalIgnoreCase)
MSDN рекомендует:
- Используйте перегрузку метода String.Equals, чтобы проверить, равны ли две строки.
- Используйте методы String.Compare и String.CompareTo для сортировки строк, не для проверки равенства.
Ответ 2
Вы должны использовать статическую функцию String.Compare
, как показано ниже
x => String.Compare (x.Username, (string)drUser["Username"],
StringComparison.OrdinalIgnoreCase) == 0
Ответ 3
Пожалуйста, используйте это для сравнения:
string.Equals(a, b, StringComparison.CurrentCultureIgnoreCase);
Ответ 4
Другие ответы здесь полностью действительны, но каким-то образом требуется некоторое время для ввода StringComparison.OrdinalIgnoreCase
а также с использованием String.Compare
.
Я написал простой метод расширения String, где вы можете указать, является ли сравнение чувствительным к регистру или бессмысленным с логическим значением, прикрепив здесь весь фрагмент кода:
using System;
/// <summary>
/// String helpers.
/// </summary>
public static class StringExtensions
{
/// <summary>
/// Compares two strings, set ignoreCase to true to ignore case comparison ('A' == 'a')
/// </summary>
public static bool CompareTo(this string strA, string strB, bool ignoreCase)
{
return String.Compare(strA, strB, ignoreCase) == 0;
}
}
После этого все сравнение укорачивается примерно на 10 символов - сравните:
Перед использованием расширения String:
String.Compare(testFilename, testToStart,true) != 0
После использования расширения String:
testFilename.CompareTo(testToStart, true)
Ответ 5
Вы можете (хотя и противоречиво) расширить System.String
чтобы предоставить метод расширения сравнения без учета регистра:
public static bool CIEquals(this String a, String b) {
return a.Equals(b, StringComparison.CurrentCultureIgnoreCase);
}
и используйте как таковой:
x.Username.CIEquals((string)drUser["Username"]);
С# позволяет вам создавать методы расширения, которые могут служить синтаксическим сахаром в вашем проекте, я бы сказал, весьма полезно.
Это не ответ, и я знаю, что этот вопрос является старым и решенным, я просто хотел добавить эти биты.
Ответ 6
Я думаю, вы найдете дополнительную информацию по этой ссылке:
http://codeidol.com/community/dotnet/controlling-case-sensitivity-when-comparing-two-st/8873/
Используйте сравнительный статический метод в классе String для сравнения двух строк. Независимо от того, является ли сравнение нечувствительным к регистру, определяется третьим параметром одной из его перегрузок. Например:
string lowerCase = "abc";
string upperCase = "AbC";
int caseInsensitiveResult = string.Compare(lowerCase, upperCase,
StringComparison.CurrentCultureIgnoreCase);
int caseSensitiveResult = string.Compare(lowerCase,
StringComparison.CurrentCulture);
Значение caseSensitiveResult равно -1 (что указывает, что lowerCase меньше "upperCase" ), а caseInsensitiveResult равен нулю (что указывает, что lowerCase равно "upperCase" ).
Ответ 7
Как использовать StringComparison.CurrentCultureIgnoreCase
вместо?
Ответ 8
вы всегда можете использовать функции:
.Понижать();
.ToUpper();
преобразуйте свои строки, а затем сравните их...
Удача