我需要做很多高性能的不区分大小写的字符串比较,并且意识到我做.ToLower().Trim()的方法真的很愚蠢,因为要分配所有新字符串
所以我仔细研究了一下,这种方式似乎更可取:
String.Compare(txt1,txt2, StringComparison.OrdinalIgnoreCase)这里唯一的问题是,我想忽略前导或尾随空格,即Trim(),但如果我使用Trim,我在字符串分配方面也会遇到同样的问题。我想我可以检查每个字符串,看看它是StartsWith(“")还是EndsWith(”"),然后才能修剪。或者计算出索引、每个字符串的长度并传递给string.Compare override
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);
}
}发布于 2009-12-08 04:06:57
下面这样的代码应该可以做到:
public static int TrimCompareIgnoreCase(string a, string b) {
int indexA = 0;
int indexB = 0;
while (indexA < a.Length && Char.IsWhiteSpace(a[indexA])) indexA++;
while (indexB < b.Length && Char.IsWhiteSpace(b[indexB])) indexB++;
int lenA = a.Length - indexA;
int lenB = b.Length - indexB;
while (lenA > 0 && Char.IsWhiteSpace(a[indexA + lenA - 1])) lenA--;
while (lenB > 0 && Char.IsWhiteSpace(b[indexB + lenB - 1])) lenB--;
if (lenA == 0 && lenB == 0) return 0;
if (lenA == 0) return 1;
if (lenB == 0) return -1;
int result = String.Compare(a, indexA, b, indexB, Math.Min(lenA, lenB), true);
if (result == 0) {
if (lenA < lenB) result--;
if (lenA > lenB) result++;
}
return result;
}示例:
string a = " asdf ";
string b = " ASDF \t ";
Console.WriteLine(TrimCompareIgnoreCase(a, b));输出:
0你应该根据一个简单的修剪来分析它,并与一些真实的数据进行比较,看看你要用它做什么真的有什么不同。
发布于 2009-12-08 03:40:34
我会用你的代码
String.Compare(txt1,txt2, StringComparison.OrdinalIgnoreCase)并在需要时添加任何.Trim()调用。这将在大多数情况下保存初始选项4字符串(.ToLower().Trim() ),并始终保存两个字符串(.ToLower())。
如果您在此之后遇到了性能问题,那么您的“凌乱”选项可能是最好的选择。
发布于 2009-12-08 03:34:27
首先,确保您确实需要优化此代码。也许创建字符串的副本不会明显地影响您的程序。
如果您确实需要优化,您可以尝试在第一次存储字符串时处理它们,而不是在比较它们时(假设它发生在程序的不同阶段)。例如,存储字符串的修剪和小写版本,这样当您比较它们时,您可以使用简单的检查等价性。
https://stackoverflow.com/questions/1862314
复制相似问题