0

可能重复:
String.comparison 性能(带修剪)

我想写一个函数来判断两个字符串是否相等,忽略第一个字符串的空格前缀和后缀,而不调用string.Trim()。还请考虑不敏感的情况。

认为:

string str1 = "   Abc   ";
string str2 = "abc";

bool trueEqual = IsEqualWithoutWhiteSpace(str1, str2, /*ignore case?*/ true);  // return true.
4

4 回答 4

1

我假设您出于性能原因想要这样做(在某些情况下这将是一个正当的理由 - 我会为您省去通常的过早优化警告)。

首先,计算两个字符串开头和结尾的空白字符数。如果非空白部分的长度不同,则返回 false。现在我们知道它具有相同的长度。

接下来,stringA.IndexOf(stringB, ...)使用适当的 start 和 count 参数调用以确定是否找到匹配项。如果匹配,则根据您的实现,字符串相等。

如果您不需要不区分大小写,您也可以使用循环来比较两个字符串的中间部分。

于 2012-07-19T14:33:10.523 回答
0

就像评论显示的那样,没有直接的理由不使用修剪。因此,如果您确信 Trim 没问题,这里有一个解决方案。

public static bool IsEqualWithoutWhiteSpace(this string aLhs, string aRhs)
{
    var left = aLhs.Trim();
    var right = aRhs.Trim();
    return left.Equals(right, StringComparison.OrdinalIgnoreCase);
}

string str1 = "   Abc   ";
string str2 = "abc";

var b = str1.IsEqualWithoutWhiteSpace(str2);

如果这是性能原因,请重新考虑您的问题,因为您问的是“有人可以为我写一个函数吗”而不是“有人可以解释为什么我的代码不起作用”。

于 2012-07-19T14:32:51.397 回答
0

再次踢罐头 Trim 是您的朋友。但是,另一种避免使用修剪的方法是:

bool found = string1.Contains(string2);

如果您确定 string1 是可能具有空格并希望区分大小写的字符串。如果您不想区分大小写,请在每个字符串后添加 .ToLower:

bool found = string1.ToLower().Contains(string2.ToLower());

最后,如果您不确定哪个有空格但只有一个有空格(例如,两个输入中的一个来自合理可靠的来源(如代码中的字符串),另一个来自用户添加的内容,但您不确定您的代码的用户可能会选择哪个顺序输入)您可以使用 or 运算符:

bool found = string1.Contains(string2) || string2.Contains(string1);

不过,这些是一种特殊情况,.Net 团队在提高代码效率方面做得很好,因此它可能调用 trim 并比较一次比比较两次并避免 Trim 调用更有效(比较必须至少查看 Len2 - Len1 组合数,一旦发现非空白字符,修剪就可以终止,因此从逻辑上讲,对于函数调用来说,这是一个更简单的问题。

于 2012-07-19T15:45:39.337 回答
0

看,不Trim()

        string str1 = "      AbC   ";
        string str2 = "abc";

        var r = new Regex("^[ \t]+|[ \t]+$");
        var trimStr1 = r.Replace(str1, "");
        var trimStr2 = r.Replace(str2, "");

        return trimStr1.Equals(str2, StringComparison.OrdinalIgnoreCase);

虽然,就像其他人所说的那样,我肯定会Trim()在我自己的一个项目中使用这个。

于 2012-07-19T14:37:48.270 回答