【发布时间】:2010-12-24 03:43:29
【问题描述】:
我需要做很多高性能的不区分大小写的字符串比较,并意识到我这样做的方式 .ToLower().Trim() 真的很愚蠢,因为所有新字符串都被分配了
所以我挖了一点,这种方式似乎更可取:
String.Compare(txt1,txt2, StringComparison.OrdinalIgnoreCase)
这里唯一的问题是我想忽略前导或尾随空格,即 Trim() 但如果我使用 Trim,我在字符串分配方面也会遇到同样的问题。我想我可以检查每个字符串,看看它是 StartsWith(" ") 还是 EndsWith(" "),然后才修剪。要么找出每个字符串的索引、长度并传递给字符串。比较覆盖
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);
}
}
【问题讨论】:
-
是什么让你觉得有问题?过早的优化是个坏主意——在你的应用程序变得“太慢”之前不需要优化。同时,专注于清晰的代码而不是快速的代码。
-
你能确定编译器没有为你优化这种情况吗?
-
我还想问这是否真的需要微优化?你在这方面真的有性能问题吗?我想在其他领域你可以在性能上获得更大的提升
-
它是针对一个非常大的字符串集的搜索引擎,所以我认为在这种情况下进行优化是相关的。此外,在自己的工具箱中拥有一个很好的字符串比较方法并不是一件坏事
-
@Anon :我不认为这是过早的优化。如果有大量字符串,则为每次比较创建新的字符串实例可能需要更长的时间。只需运行一些测试,然后自己看看...
标签: c# string string-comparison