有没有 C # 不区分大小写的等于运算符?

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

if (StringA == StringB) {

那么是否存在一个操作符,它会以不敏感的方式比较两个字符串?

138804 次浏览

试试这个:

string.Equals(a, b, StringComparison.CurrentCultureIgnoreCase);
System.Collections.CaseInsensitiveComparer

或者

System.StringComparer.OrdinalIgnoreCase

运算符? 不,但我认为您可以更改区域性,以便字符串比较不区分大小写。

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

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

string.Equals(StringA, StringB, StringComparison.CurrentCultureIgnoreCase);
if (StringA.ToUpperInvariant() == StringB.ToUpperInvariant()) {

人们报告说 ToUpperInvariable ()比 ToLowerInvari()快。

你可以用

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

或者

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

但是你需要确定 StringA 不是 null,所以你最好使用:

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

就像约翰建议的那样

修正了错误

string.Compare(string1, string2, true)

StringComparer静态类上有许多属性,它们可以返回比较器,以满足您可能需要的任何大小写敏感性:

StringComparer物业

比如,你可以打电话

StringComparer.CurrentCultureIgnoreCase.Equals(string1, string2)

或者

StringComparer.CurrentCultureIgnoreCase.Compare(string1, string2)

它比使用 StringComparison参数的 string.Equalsstring.Compare重载要干净一些。

我非常习惯在这些比较方法的末尾输入: , StringComparison.

所以我延期了。

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

请注意,在调用 ext. 之前,您需要在 thisString上检查 null。

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

我测试了这两种方法的性能,序数忽略大小写字符串比较是 超过9倍的速度!它也比将字符串转换为小写或大写更可靠(查看土耳其语 i 问题)。因此,始终使用 字符串,等于方法比较字符串是否相等:

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

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

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

请注意,第二个示例使用当前区域性的字符串比较逻辑,这使得它比第一个示例中的“有序忽略大小写”比较慢,所以如果您不需要任何特定于区域性的字符串比较逻辑,并且您已经达到了最大性能,那么使用“有序忽略大小写”比较。

了解更多信息,请登录 在我的博客上看完整的故事

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

我编写了一个简单的 String 扩展方法,你可以在这里指定比较是区分大小写还是无区分大小写:

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

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

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

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