Как я могу провести сравнение строк без учета регистра?

Как сделать строку ниже регистрозависимой?

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

преобразуйте свои строки, а затем сравните их...

Удача