Как сделать строку ниже без учета регистра?
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)));
Кто-нибудь может указать на проблему?
drUser["Enrolled"]
быть? Это выглядит как логическое значение, ноFindIndex()
возвращает индекс. Если индекс этого пользователя равен 0, он вернет 0, что может быть ложным. Когда на самом деле это правда.Exists()
Метод может быть лучше в этом случае.Ответы:
Это не лучшая практика в .NET Framework (4 & +) для проверки равенства
Используйте следующее вместо
MSDN рекомендует:
источник
string.Compare
, а неString.Compare
.string
- лучшая практика, чемString
ключевое слово языка. С одной стороны,String
может быть что-то другоеSystem.String
, аstring
не может быть. Кроме того,string
более или менее гарантированно существует в C #, тогдаString
как технически является частью .NET, а не C #.Вы должны использовать статическую
String.Compare
функцию, как показано нижеисточник
String.Equals
вместоString.Compare
. Нет необходимости вычислять, какой из них больше, просто они не равны.IEquatable
иIComparable
НЕ делайте то же самое, и у вас могут быть классы, которые реализуют один, но в котором не имеет смысла реализовывать другой. Например, вы можете упорядочить выборки датчиков по времени, не имея при этом равных (IComparable). И вы можете указать, равны ли вещи (IEquatable), но нет смысла заказывать их (скажем, серийные номера компьютера).Пожалуйста, используйте это для сравнения:
источник
Другие ответы здесь полностью действительны, но каким-то образом требуется некоторое время, чтобы напечатать,
StringComparison.OrdinalIgnoreCase
а также использоватьString.Compare
.Я написал простой метод расширения String, где вы можете указать, является ли сравнение чувствительным к регистру или бессмысленным с логическим значением, прикрепив здесь весь фрагмент кода:
После этого все сравнение укорачивается примерно на 10 символов - сравните:
Перед использованием расширения String:
После использования расширения String:
источник
Вы можете (хотя и противоречиво) расширить,
System.String
чтобы предоставить метод расширения сравнения без учета регистра:и используйте как таковой:
C # позволяет вам создавать методы расширения, которые могут служить синтаксическим сахаром в вашем проекте, я бы сказал, весьма полезно.
Это не ответ, и я знаю, что этот вопрос старый и решенный, я просто хотел добавить эти биты.
источник
Я думаю, вы найдете больше информации по этой ссылке:
http://codeidol.com/community/dotnet/controlling-case-sensitivity-when-comparing-two-st/8873/
Используйте статический метод Compare в классе String, чтобы сравнить две строки. Является ли сравнение регистронезависимым, определяется третьим параметром одной из его перегрузок. Например:
Значение caseSensitiveResult равно -1 (указывает на то, что lowerCase «меньше, чем» upperCase), а caseInsensitiveResult равно нулю (указывает, что lowerCase «равно» upperCase).
источник
Как насчет использования
StringComparison.CurrentCultureIgnoreCase
вместо?источник
Я хотел бы написать метод расширения для EqualsIgnoreCase
источник
Вы всегда можете использовать функции: .ToLower (); .ToUpper ();
преобразовать ваши строки, а затем сравнить их ...
Удачи
источник