如何进行不区分大小写的字符串比较?

Jam*_*mie 204 c# case-insensitive string-comparison

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

drUser["Enrolled"] = 
      (enrolledUsers.FindIndex(x => x.Username == (string)drUser["Username"]) != -1);
Run Code Online (Sandbox Code Playgroud)

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

x.Username.Equals((string)drUser["Username"], StringComparison.OrdinalIgnoreCase)));
Run Code Online (Sandbox Code Playgroud)

麻烦的是我不能让这个工作,我已经尝试了下面的行,这个编译但返回错误的结果,它返回注册用户作为注册的未注册和未注册的用户.

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

任何人都可以指出这个问题吗?

oce*_*eam 383

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

String.Compare(x.Username, (string)drUser["Username"], 
                  StringComparison.OrdinalIgnoreCase) == 0
Run Code Online (Sandbox Code Playgroud)

请改用以下内容

String.Equals(x.Username, (string)drUser["Username"], 
                   StringComparison.OrdinalIgnoreCase) 
Run Code Online (Sandbox Code Playgroud)

MSDN建议:

  • 使用String.Equals方法的重载来测试两个字符串是否相等.
  • 使用String.CompareString.CompareTo 方法对字符串进行排序,而不是检查是否相等.

  • @Fred我希望出于技术原因,而不是"因为Stylecop这么说".我错过了什么吗? (21认同)
  • @Gusdor`tring`比`String`更好,因为它是一个语言关键字.首先,`String`可能不是`System.String`,而`string`不能.此外,`string`或多或少保证存在于C#中,而`String`在技术上是.NET的一部分而不是C#. (21认同)
  • 没有区别string.compare与String.Compare,字符串同义词System.String类.和成员比较是一种扩展方法.@ Fred @Gusdor (11认同)
  • 你应该使用`string.Compare`,而不是`String.Compare`. (8认同)
  • @Fred我同意但你能否证明原因? (4认同)
  • @KyleDelaney 字符串比较并不像两个字符串之间的“相等”那么简单。例如,在英语中,“encyclopaedia”和“encyclopædia”是等效的,[即使它不是同一个字符串](https://learn.microsoft.com/en-us/dotnet/api/system.stringcomparison?view=netframework- 4.7.1#System_StringComparison_OrdinalIgnoreCase)。`string.Equals()` 允许您在进行比较时指定文化细节。此外,代码更能说明其意图。 (4认同)
  • @KyleDelaney因为第二个需要将“a”和“b”复制到额外的内存以保存它们的小写版本,这对于大字符串来说可能很昂贵,然后对这两个新字符串进行第二次迭代。想象一下,如果“a”和“b”是长大写但相同的字符串。 (2认同)

Ole*_*leg 36

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

x => String.Compare (x.Username, (string)drUser["Username"],
                     StringComparison.OrdinalIgnoreCase) == 0
Run Code Online (Sandbox Code Playgroud)

  • 我道歉,我把它作为对我评论正确性的批评.如果你说的是你承认你的旧答案可能不是最好的答案,那就太好了!但是,我不得不就你的旧答案不同意.应该*评论提供不良信息*的旧答案,*应该*进行评选,因为它们仍在通知*今天的*读者. (17认同)
  • 不,你应该使用`String.Equals`而不是`String.Compare`.没有必要计算哪一个更大,只是它们不相等. (5认同)
  • 我不奇怪!我相信我会推荐在需要相等语义时使用相等,并在需要比较语义时使用 compare。这有什么难的?`IEquatable` 和 `IComparable` 不做同样的事情,你可以让类实现一个,但在其中实现另一个没有意义。例如,您可以按时间排序传感器采样,而它们中的任何一个都不相等(IComparable)。并且,您可以指出事物是否相等(IEquatable),但对它们进行排序是没有意义的(例如,计算机序列号)。 (3认同)

小智 22

请用它来比较:

string.Equals(a, b, StringComparison.CurrentCultureIgnoreCase);
Run Code Online (Sandbox Code Playgroud)

  • 请注意使用CurrentCultureIgnoreCase与OrdinalIgnoreCase的优点和缺陷.如果您不需要文化比较的语义,请保存一些性能并使用序数比较. (9认同)

Fel*_*ype 7

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

public static bool CIEquals(this String a, String b) {
    return a.Equals(b, StringComparison.CurrentCultureIgnoreCase);
}
Run Code Online (Sandbox Code Playgroud)

并使用如下:

x.Username.CIEquals((string)drUser["Username"]);
Run Code Online (Sandbox Code Playgroud)

C#允许您创建可以作为项目语法的扩展方法,我会说非常有用.

这不是答案,我知道这个问题已经过时并且已经解决了,我只想添加这些内容.


Tar*_*aro 7

其他答案在这里完全有效,但不知何故,它需要一些时间来打字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;
    }
}
Run Code Online (Sandbox Code Playgroud)

之后,整个比较大约缩短10个字符 - 比较:

在使用String扩展之前:

String.Compare(testFilename, testToStart,true) != 0
Run Code Online (Sandbox Code Playgroud)

使用String扩展后:

testFilename.CompareTo(testToStart, true)
Run Code Online (Sandbox Code Playgroud)

  • 我不同意命名,比较是软件开发中的一个众所周知的功能,您已经从根本上改变了它的功能。我认为您应该返回一个像 compare 的 int 或将名称更改为其他名称,例如“IsEqual”。 (2认同)

Ran*_*nga 7

我想为 EqualsIgnoreCase 编写一个扩展方法

public static class StringExtensions
{
    public static bool? EqualsIgnoreCase(this string strA, string strB)
    {
        return strA?.Equals(strB, StringComparison.CurrentCultureIgnoreCase);
    }
}
Run Code Online (Sandbox Code Playgroud)


dec*_*one 1

改用怎么样StringComparison.CurrentCultureIgnoreCase

  • -1:这个答案是不够的。请参阅@ocean4dream的答案:http://stackoverflow.com/a/13965429/109941。 (5认同)