我想比较两个不区分大小写的字符串,但我不确定最好的方法。字符串的平均长度为 20,这个问题更多的是关于最先进的技术,而不是关于最佳性能
我的大部分代码使用
bool output = "foo".ToLower() == "FOO".ToLower();
这对我来说似乎有点过时了。我见过很多次的另一种方式是
bool output = Regex.IsMatch("foo", "FOO", RegexOptions.IgnoreCase);
我想这是可能的,但 RegEx 不是为这么简单的事情而设计的。
之后还剩下 3 个“好的”方式:
bool output = string.Compare("foo", "FOO", StringComparison.CurrentCultureIgnoreCase) == 0;
bool output = string.Compare("foo", "FOO", true) == 0;
bool output = "foo".Equals("FOO", StringComparison.CurrentCultureIgnoreCase);
如果你看看相应的引用资料
https://referencesource.microsoft.com/#mscorlib/system/string.cs,bda3b2c94b5251ce
public static int Compare(String strA, String strB, bool ignoreCase)
{
if (ignoreCase) {
return CultureInfo.CurrentCulture.CompareInfo.Compare(strA, strB, CompareOptions.IgnoreCase);
}
return CultureInfo.CurrentCulture.CompareInfo.Compare(strA, strB, CompareOptions.None);
}
https://referencesource.microsoft.com/#mscorlib/system/string.cs,0be9474bc8e160b6
public static int Compare(String strA, String strB, StringComparison comparisonType)
{
...
// Agrument validation, reference equality, null test
switch (comparisonType) {
...
case StringComparison.CurrentCultureIgnoreCase:
return CultureInfo.CurrentCulture.CompareInfo.Compare(strA, strB, CompareOptions.IgnoreCase);
https://referencesource.microsoft.com/#mscorlib/system/string.cs,d47c1f57ad1e1e6e
public static bool Equals(String a, String b, StringComparison comparisonType) {
...
// Agrument validation, reference equality, null test
switch (comparisonType) {
...
case StringComparison.CurrentCultureIgnoreCase:
return (CultureInfo.CurrentCulture.CompareInfo.Compare(a, b, CompareOptions.None) == 0);
您会发现这三种方法相同。至于其他方式,Regex.IsMatch
肯定是overshoot(你要做的就是比较字符串); ToLower()
在处理特定于文化的字母时可能会很棘手,请参阅
https://en.wikipedia.org/wiki/Dotted_and_dotless_I
这就是为什么更好的设计是清楚地声明您的意图(=我想比较字符串)然后掩盖它们(让系统欺骗您)