String.comparison性能(带修剪)

Hom*_*mde 10 c# string string-comparison

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

所以我挖了一点,这种方式似乎更可取:

String.Compare(txt1,txt2, StringComparison.OrdinalIgnoreCase)
Run Code Online (Sandbox Code Playgroud)

这里唯一的问题是我想忽略前导或尾随空格,即Trim(),但如果我使用Trim,我对字符串分配也有同样的问题.我想我可以检查每个字符串,看看它是StartsWith("")还是EndsWith("")然后才修剪.要么指出索引,要么计算每个字符串的长度并传递给string.Compare覆盖

public static int Compare
(
    string strA,
    int indexA,
    string strB,
    int indexB,
    int length,
    StringComparison comparisonType
) 
Run Code Online (Sandbox Code Playgroud)

但是这看起来相当混乱我可能不得不使用一些整数,如果我没有为两个字符串上的尾随和前导空白的每个组合制作一个非常大的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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

Guf*_*ffa 5

这样的事情应该这样做:

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;
}
Run Code Online (Sandbox Code Playgroud)

例:

string a = "  asdf ";
string b = " ASDF \t   ";

Console.WriteLine(TrimCompareIgnoreCase(a, b));
Run Code Online (Sandbox Code Playgroud)

输出:

0
Run Code Online (Sandbox Code Playgroud)

你应该对一个简单的Trim进行分析,并与一些真实数据进行比较,看看你将要使用它的确有什么不同.

  • @konrad您将此解决方案与Trim进行比较的结果如何? (4认同)