248

How can I make the line below case insensitive?

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

I was given some advice earlier today that suggested I use:

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

the trouble is I can't get this to work, I've tried the line below, this compiles but returns the wrong results, it returns enrolled users as unenrolled and unenrolled users as enrolled.

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

Can anyone point out the problem?

4

9 回答 9

448

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

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

改用以下内容

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

MSDN 建议:

  • 使用 String.Equals 方法的重载来测试两个字符串是否相等。
  • 使用String.CompareString.CompareTo 方法对字符串进行排序,而不是检查相等性
于 2012-12-20T04:40:52.723 回答
38

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

x => String.Compare (x.Username, (string)drUser["Username"],
                     StringComparison.OrdinalIgnoreCase) == 0
于 2010-06-25T23:05:30.417 回答
35

请使用此进行比较:

string.Equals(a, b, StringComparison.CurrentCultureIgnoreCase);
于 2016-02-17T04:57:15.360 回答
7

其他人的回答在这里完全有效,但不知何故,输入StringComparison.OrdinalIgnoreCase和使用String.Compare.

我编写了简单的字符串扩展方法,您可以在其中指定比较是区分大小写还是不区分大小写与布尔值,在此处附加整个代码片段:

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)
于 2018-03-10T10:43:07.723 回答
7

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

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

并这样使用:

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

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

这不是答案,我知道这个问题已经过时且已解决,我只是想添加这些位。

于 2017-07-17T15:07:57.280 回答
4

我想为 EqualsIgnoreCase 写一个扩展方法

public static class StringExtensions
{
    public static bool? EqualsIgnoreCase(this string strA, string strB)
    {
        return strA?.Equals(strB, StringComparison.CurrentCultureIgnoreCase);
    }
}
于 2020-02-27T20:36:58.693 回答
3

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

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

使用 String 类的 Compare 静态方法来比较两个字符串。比较是否不区分大小写由其重载之一的第三个参数确定。例如:

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

于 2016-11-21T00:33:09.237 回答
1

How about using StringComparison.CurrentCultureIgnoreCase instead?

于 2010-06-25T23:00:14.533 回答
-12

你总是可以使用函数:.ToLower(); .ToUpper();

转换你的字符串,然后比较它们......

祝你好运

于 2014-07-31T11:45:29.797 回答