关于c#:如何进行不区分大小写的字符串比较?

How can I do a case insensitive string comparison?

如何使下面的行不区分大小写?

1
2
drUser["Enrolled"] =
      (enrolledUsers.FindIndex(x => x.Username == (string)drUser["Username"]) != -1);

今天早些时候我得到了一些建议,建议我使用:

1
x.Username.Equals((string)drUser["Username"], StringComparison.OrdinalIgnoreCase)));

问题是我不能让它工作,我尝试了下面的行,它编译但返回错误的结果,它将注册用户作为未注册用户返回,将未注册用户作为已注册用户返回。

1
2
3
drUser["Enrolled"] =
      (enrolledUsers.FindIndex(x => x.Username.Equals((string)drUser["Username"],
                                 StringComparison.OrdinalIgnoreCase)));

有人能指出问题所在吗?


这不是.NET框架(4&;+)中检查相等性的最佳实践

1
2
String.Compare(x.Username, (string)drUser["Username"],
                  StringComparison.OrdinalIgnoreCase) == 0

改为使用以下内容

1
2
String.Equals(x.Username, (string)drUser["Username"],
                   StringComparison.OrdinalIgnoreCase)

msdn建议:

  • Use an overload of the String.Equals method to test whether two strings are equal.
  • Use the String.Compare and String.CompareTo methods to sort strings, not to check for equality.


您应该使用静态String.Compare函数,如下所示

1
2
x => String.Compare (x.Username, (string)drUser["Username"],
                     StringComparison.OrdinalIgnoreCase) == 0


请使用此项进行比较:

1
string.Equals(a, b, StringComparison.CurrentCultureIgnoreCase);


其他答案在这里是完全有效的,但不知何故,输入StringComparison.OrdinalIgnoreCase和使用String.Compare需要一些时间。

我已经对简单字符串扩展方法进行了编码,您可以在其中指定比较是区分大小写还是使用布尔值区分大小写,并在此处附加整个代码段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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个字符-比较:

在使用字符串扩展名之前:

1
String.Compare(testFilename, testToStart,true) != 0

使用字符串扩展名后:

1
testFilename.CompareTo(testToStart, true)


您可以(尽管Controver)扩展System.String以提供不区分大小写的比较扩展方法:

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

并以此方式使用:

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

C允许您创建扩展方法,在您的项目中用作语法suggar,我会说这非常有用。

这不是答案,我知道这个问题已经解决了,我只是想补充一下。


我想你会在这个链接中找到更多信息:

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

在string类上使用compare static方法比较两个字符串。比较是否不区分大小写取决于其中一个重载的第三个参数。例如:

1
2
3
4
5
6
string lowerCase ="abc";
string upperCase ="AbC";
int caseInsensitiveResult = string.Compare(lowerCase, upperCase,
  StringComparison.CurrentCultureIgnoreCase);
int caseSensitiveResult = string.Compare(lowerCase,
  StringComparison.CurrentCulture);

casesensitiveResult值为-1(表示小写字母"小于"大写字母),casesensitiveResult为零(表示小写字母"等于"大写字母)。


StringComparison.CurrentCultureIgnoreCase代替怎么样?


您可以始终使用函数:TooWror();Toupter();

转换字符串,然后比较它们…

祝你好运