我需要做很多高性能的不区分大小写的字符串比较,并意识到我的方法.ToLower().Trim()由于所有新字符串都被分配了,所以非常愚蠢。
因此,我进行了一些探索,发现以下方法更可取:
String.Compare(txt1,txt2, StringComparison.OrdinalIgnoreCase)
唯一的问题在于我想忽略字符串开头或结尾的空格,也就是说需要使用 Trim() 函数,但如果使用 Trim() 函数,又会面临字符串分配的问题。我猜我可以检查每个字符串,看它是否以空格开头或结尾,只有那些字符串才进行 Trim 操作。要么就找出每个字符串的索引和长度,然后传递给 string.Compare 函数的一个重载版本。public static int Compare
(
string strA,
int indexA,
string strB,
int indexB,
int length,
StringComparison comparisonType
)
但这似乎相当混乱,我可能必须使用一些整数,如果不为每个字符串的尾随和前导空格组合制作一个非常大的if-else语句...那么有没有什么优雅的解决方案?
这是我的当前提议:
public bool IsEqual(string a, string b)
{
return (string.Compare(a, b, StringComparison.OrdinalIgnoreCase) == 0);
}
public bool IsTrimEqual(string a, string b)
{
if (Math.Abs(a.Length- b.Length) > 2 ) // if length differs by more than 2, cant be equal
{
return false;
}
else if (IsEqual(a,b))
{
return true;
}
else
{
return (string.Compare(a.Trim(), b.Trim(), StringComparison.OrdinalIgnoreCase) == 0);
}
}