我知道以下内容区分大小写:
if (StringA == StringB) {
那么,是否有一个运算符将以不敏感的方式比较两个字符串?
~=
于parallel 定义==
为不区分大小写的版本。
我知道以下内容区分大小写:
if (StringA == StringB) {
那么,是否有一个运算符将以不敏感的方式比较两个字符串?
~=
于parallel 定义==
为不区分大小写的版本。
Answers:
试试这个:
string.Equals(a, b, StringComparison.CurrentCultureIgnoreCase);
if A$=B$ then goto 10
” 的日子已经一去不复返了
比较2个忽略字母大小写的字符串的最佳方法是使用String.Equals静态方法,指定一个有序的忽略大小写字符串比较。这也是最快的方法,比将字符串转换为小写或大写并在此之后进行比较要快得多。
我测试了这两种方法的性能,顺序的忽略大小写字符串比较的速度快了9倍以上!它比将字符串转换为小写或大写更为可靠(请查看Turkish i问题)。因此,请始终使用String.Equals方法比较字符串是否相等:
String.Equals(string1, string2, StringComparison.OrdinalIgnoreCase);
如果要执行区域性特定的字符串比较,可以使用以下代码:
String.Equals(string1, string2, StringComparison.CurrentCultureIgnoreCase);
请注意,第二个示例使用当前区域性的字符串比较逻辑,这使其比第一个示例中的“常规忽略大小写”比较慢,因此,如果您不需要任何特定于区域性的字符串比较逻辑,则可以达到最佳性能后,请使用“常规忽略大小写”比较。
有关更多信息,请阅读我的博客上的全文。
ToLower
或ToLowerInvariant
:它们只是为了进行比较而创建内存,并且可能会在将新字符集添加到unicode时失败。ToUpper
由于土耳其语“ i”等原因而失败;ToLower
出于类似原因,将来没有理由不会失败。
ToLower
或ToLowerInvariant
方法,我只是想展示该String.Equals
方法的效率高得多。
StringComparer
静态类上有许多属性可以返回比较器,以获取您可能需要的任何区分大小写的类型:
例如,您可以致电
StringComparer.CurrentCultureIgnoreCase.Equals(string1, string2)
要么
StringComparer.CurrentCultureIgnoreCase.Compare(string1, string2)
它比接受参数的string.Equals
或string.Compare
重载要干净一些StringComparison
。
System.Collections.CaseInsensitiveComparer
要么
System.StringComparer.OrdinalIgnoreCase
您可以使用
if (stringA.equals(StringB, StringComparison.CurrentCultureIgnoreCase))
操作员?不,但是我认为您可以更改文化,以使字符串比较不区分大小写。
// you'll want to change this...
System.Threading.Thread.CurrentThread.CurrentCulture
// and you'll want to custimize this
System.Globalization.CultureInfo.CompareInfo
我相信它将改变equals运算符比较字符串的方式。
这里有一个简化语法的想法:
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
IgnoreCase
vs IgnoreCaseString
)和模棱两可(Java选择隐式拆箱与隐式装箱,因此我认为在Java中将隐式转换回字符串后,该方法将不起作用)。这就创建了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
在调用ext之前检查null 。
if (StringA.ToUpperInvariant() == StringB.ToUpperInvariant()) {
人们报告ToUpperInvariant()比ToLowerInvariant()更快。
其他答案在这里完全有效,但是以某种方式键入StringComparison.OrdinalIgnoreCase
和使用也需要一些时间String.Compare
。
我已经编码了简单的String扩展方法,您可以在其中指定比较是否区分大小写或使用布尔值区分大小写-参见以下答案: