是否存在C#大小写不敏感的等于运算符?

时间:2009-03-10 16:52:52

标签: c# .net string operators case-insensitive

我知道以下是区分大小写的:

if (StringA == StringB) {

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

15 个答案:

答案 0 :(得分:273)

试试这个:

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

答案 1 :(得分:28)

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

我测试了两种方法的性能,并且序数忽略情况字符串比较快了9倍!它比将字符串转换为小写或大写更可靠(请查看土耳其语问题)。因此,始终使用String.Equals方法来比较字符串是否相等:

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

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

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

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

有关详细信息,请read the full story on my blog

答案 2 :(得分:18)

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

StringComparer Properties

例如,您可以致电

StringComparer.CurrentCultureIgnoreCase.Equals(string1, string2)

StringComparer.CurrentCultureIgnoreCase.Compare(string1, string2)

比采用StringComparison参数的string.Equalsstring.Compare重载更清晰。

答案 3 :(得分:15)

System.Collections.CaseInsensitiveComparer

System.StringComparer.OrdinalIgnoreCase

答案 4 :(得分:9)

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

答案 5 :(得分:7)

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

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

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

正如约翰所建议的那样

编辑:纠正了错误

答案 6 :(得分:4)

您可以使用

if (stringA.equals(StringB, StringComparison.CurrentCultureIgnoreCase))

答案 7 :(得分:4)

这是一个简化语法的想法:

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

答案 8 :(得分:3)

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

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

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

答案 9 :(得分:2)

我习惯在这些比较方法的末尾打字:, 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检查空值。

答案 10 :(得分:0)

if (StringA.ToUpperInvariant() == StringB.ToUpperInvariant()) {

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

答案 11 :(得分:0)

string.Compare(string1, string2, true)

答案 12 :(得分:0)

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

我编写了简单的字符串扩展方法,您可以在其中指定比较是区分大小写还是粗略无效 - 请参阅以下答案:

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

答案 13 :(得分:0)

只需

if (stringA.toLower() == stringB) {};

然后将StringB写为小写,也执行stringB.toLower()

.toLower()返回字符串的小写形式,因此不会更改原始字符串。

答案 14 :(得分:-1)

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