Как я могу сделать сравнение строк без учета регистра? - PullRequest
197 голосов
/ 26 июня 2010

Как сделать строку ниже без учета регистра?

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)));

Кто-нибудь может указать на проблему?

Ответы [ 8 ]

369 голосов
/ 20 декабря 2012

Это не лучшая практика в .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 для сортировки строк, не для проверки на равенство .
35 голосов
/ 26 июня 2010

Вы должны использовать статическую String.Compare функцию, подобную следующей

x => String.Compare (x.Username, (string)drUser["Username"],
                     StringComparison.OrdinalIgnoreCase) == 0
20 голосов
/ 17 февраля 2016

Пожалуйста, используйте это для сравнения:

string.Equals(a, b, StringComparison.CurrentCultureIgnoreCase);
6 голосов
/ 10 марта 2018

Другие ответы здесь полностью действительны, но каким-то образом для ввода 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.Compare(testFilename, testToStart,true) != 0

После использования расширения строки:

testFilename.CompareTo(testToStart, true)
4 голосов
/ 17 июля 2017

Вы можете (хотя и противоречиво) расширить System.String, чтобы предоставить метод расширения сравнения без учета регистра:

public static bool CIEquals(this String a, String b) {
    return a.Equals(b, StringComparison.CurrentCultureIgnoreCase);
}

и использовать как таковой:

x.Username.CIEquals((string)drUser["Username"]);

C # позволяет создаватьМетоды расширения, которые могут служить синтаксическим сахаром в вашем проекте, я бы сказал, очень полезно.

Это не ответ, и я знаю, что этот вопрос старый и решен, я просто хотел добавить эти биты.

3 голосов
/ 21 ноября 2016

Я думаю, вы найдете больше информации по этой ссылке:

http://codeidol.com/community/dotnet/controlling-case-sensitivity-when-comparing-two-st/8873/

Используйте статический метод Compare в классе 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).

1 голос
/ 26 июня 2010

Как насчет использования StringComparison.CurrentCultureIgnoreCase вместо?

0 голосов
/ 31 июля 2014

вы всегда можете использовать функции: .ToLower ();.ToUpper ();

преобразовать ваши строки и сравнить их ...

Удачи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...