首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >String.comparison性能(带修剪)

String.comparison性能(带修剪)
EN

Stack Overflow用户
提问于 2009-12-08 03:29:39
回答 8查看 12.5K关注 0票数 10

我需要做很多高性能的不区分大小写的字符串比较,并且意识到我做.ToLower().Trim()的方法真的很愚蠢,因为要分配所有新字符串

所以我仔细研究了一下,这种方式似乎更可取:

代码语言:javascript
复制
String.Compare(txt1,txt2, StringComparison.OrdinalIgnoreCase)

这里唯一的问题是,我想忽略前导或尾随空格,即Trim(),但如果我使用Trim,我在字符串分配方面也会遇到同样的问题。我想我可以检查每个字符串,看看它是StartsWith(“")还是EndsWith(”"),然后才能修剪。或者计算出索引、每个字符串的长度并传递给string.Compare override

代码语言:javascript
复制
public static int Compare
(
    string strA,
    int indexA,
    string strB,
    int indexB,
    int length,
    StringComparison comparisonType
) 

但这看起来相当混乱,如果我不为两个字符串上的尾随和前导空格的每个组合创建一个非常大的if-else语句,我可能不得不使用一些整数……那么,有没有一个优雅的解决方案呢?

这是我目前的建议:

代码语言:javascript
复制
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);
        }
    }
EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2009-12-08 04:06:57

下面这样的代码应该可以做到:

代码语言:javascript
复制
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;
}

示例:

代码语言:javascript
复制
string a = "  asdf ";
string b = " ASDF \t   ";

Console.WriteLine(TrimCompareIgnoreCase(a, b));

输出:

代码语言:javascript
复制
0

你应该根据一个简单的修剪来分析它,并与一些真实的数据进行比较,看看你要用它做什么真的有什么不同。

票数 6
EN

Stack Overflow用户

发布于 2009-12-08 03:40:34

我会用你的代码

代码语言:javascript
复制
String.Compare(txt1,txt2, StringComparison.OrdinalIgnoreCase)

并在需要时添加任何.Trim()调用。这将在大多数情况下保存初始选项4字符串(.ToLower().Trim() ),并始终保存两个字符串(.ToLower())。

如果您在此之后遇到了性能问题,那么您的“凌乱”选项可能是最好的选择。

票数 3
EN

Stack Overflow用户

发布于 2009-12-08 03:34:27

首先,确保您确实需要优化此代码。也许创建字符串的副本不会明显地影响您的程序。

如果您确实需要优化,您可以尝试在第一次存储字符串时处理它们,而不是在比较它们时(假设它发生在程序的不同阶段)。例如,存储字符串的修剪和小写版本,这样当您比较它们时,您可以使用简单的检查等价性。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1862314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档