我想比较两个不区分大小写的字符串,但是我不确定执行此操作的最佳方法。琴弦的平均长度为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
绝对是过冲(您要做的就是比较字符串);ToLower()
在处理文化特定字母时可能会很棘手,请参阅
https://zh.wikipedia.org/wiki/点缀_无点_I
这就是为什么更好的设计是清楚地声明您的意图(=我想比较字符串)然后屏蔽它们(然后让系统欺骗您)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句