171

我知道以下内容区分大小写:

if (StringA == StringB) {

那么是否有一个运算符会以不敏感的方式比较两个字符串?

4

14 回答 14

306

试试这个:

string.Equals(a, b, StringComparison.CurrentCultureIgnoreCase);
于 2009-03-10T16:54:31.480 回答
44

比较忽略字母大小写的 2 个字符串的最佳方法是使用String.Equals静态方法指定序数忽略大小写字符串比较。这也是最快的方法,比将字符串转换为小写或大写并在此之后进行比较要快得多。

我测试了这两种方法的性能,序数忽略大小写字符串比较快了 9 倍以上!它也比将字符串转换为小写或大写更可靠(查看土耳其语 i 问题)。所以总是使用String.Equals方法来比较字符串是否相等:

String.Equals(string1, string2, StringComparison.OrdinalIgnoreCase);

如果要执行特定于文化的字符串比较,可以使用以下代码:

String.Equals(string1, string2, StringComparison.CurrentCultureIgnoreCase);

请注意,第二个示例使用当前文化的字符串比较逻辑,这使得它比第一个示例中的“序数忽略大小写”比较慢,所以如果您不需要任何文化特定的字符串比较逻辑并且您是达到最佳性能后,使用“序数忽略大小写”比较。

有关更多信息,请阅读我的博客上的完整故事

于 2012-09-10T10:17:04.523 回答
20

静态类上有许多属性可以StringComparer为您可能想要的任何类型的区分大小写返回比较器:

StringComparer特性

例如,您可以调用

StringComparer.CurrentCultureIgnoreCase.Equals(string1, string2)

或者

StringComparer.CurrentCultureIgnoreCase.Compare(string1, string2)

它比带参数的string.Equalsor重载要干净一些。string.CompareStringComparison

于 2009-03-10T19:09:23.483 回答
14
System.Collections.CaseInsensitiveComparer

或者

System.StringComparer.OrdinalIgnoreCase
于 2009-03-10T16:54:40.920 回答
9
string.Equals(StringA, StringB, StringComparison.CurrentCultureIgnoreCase);
于 2009-03-10T16:55:27.797 回答
8

或者

if (StringA.Equals(StringB, StringComparison.CurrentCultureIgnoreCase)) {

但您需要确保 StringA 不为空。所以可能更好的你使用:

string.Equals(StringA , StringB, StringComparison.CurrentCultureIgnoreCase);

正如约翰建议的那样

编辑:更正了错误

于 2009-03-10T16:56:45.517 回答
4

您可以使用

if (stringA.equals(StringB, StringComparison.CurrentCultureIgnoreCase))
于 2009-03-10T16:56:01.947 回答
3

操作员?不,但我认为您可以更改您的文化,以便字符串比较不区分大小写。

// you'll want to change this...
System.Threading.Thread.CurrentThread.CurrentCulture
// and you'll want to custimize this
System.Globalization.CultureInfo.CompareInfo

我相信它会改变 equals 运算符比较字符串的方式。

于 2009-03-10T16:55:11.183 回答
3

这里有一个简化语法的想法:

public class IgnoreCase
{
    private readonly string _value;

    public IgnoreCase(string s)
    {
        _value = s;
    }

    protected bool Equals(IgnoreCase other)
    {
        return this == other;
    }

    public override bool Equals(object obj)
    {
        return obj != null &&
               (ReferenceEquals(this, obj) || (obj.GetType() == GetType() && this == (IgnoreCase) obj));
    }

    public override int GetHashCode()
    {
        return _value?.GetHashCode() ?? 0;
    }

    public static bool operator ==(IgnoreCase a, IgnoreCase b)
    {
        return string.Equals(a, b, StringComparison.OrdinalIgnoreCase);
    }

    public static bool operator !=(IgnoreCase a, IgnoreCase b)
    {
        return !(a == b);
    }

    public static implicit operator string(IgnoreCase s)
    {
        return s._value;
    }

    public static implicit operator IgnoreCase(string s)
    {
        return new IgnoreCase(s);
    }
}

可用如:

Console.WriteLine((IgnoreCase) "a" == "b"); // false
Console.WriteLine((IgnoreCase) "abc" == "abC"); // true
Console.WriteLine((IgnoreCase) "Abc" == "aBc"); // true
Console.WriteLine((IgnoreCase) "ABC" == "ABC"); // true
于 2018-05-09T12:30:49.057 回答
1

我习惯于在这些比较方法的末尾打字:, StringComparison.

所以我做了一个扩展。

namespace System
{   public static class StringExtension
    {
        public static bool Equals(this string thisString, string compareString,
             StringComparison stringComparison)
        {
            return string.Equals(thisString, compareString, stringComparison);
        }
    }
}

thisString请注意,在调用分机之前,您需要检查 null on 。

于 2012-07-24T02:29:46.607 回答
0
if (StringA.ToUpperInvariant() == StringB.ToUpperInvariant()) {

人们报告 ToUpperInvariant() 比 ToLowerInvariant() 快。

于 2009-03-10T16:55:31.167 回答
0
string.Compare(string1, string2, true)
于 2009-03-10T17:19:29.160 回答
0

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

我编写了简单的字符串扩展方法,您可以在其中指定比较是区分大小写还是不区分大小写的布尔值 - 请参见以下答案:

https://stackoverflow.com/a/49208128/2338477

于 2018-03-10T10:46:33.310 回答
0

//您可以通过 s1.ToLower() == s2.ToLower(); 使其不区分大小写

于 2021-08-03T16:29:08.423 回答