我想写一个函数来判断两个字符串是否相等,忽略第一个字符串的空格前缀和后缀,而不调用string.Trim()。还请考虑不敏感的情况。
认为:
string str1 = " Abc ";
string str2 = "abc";
bool trueEqual = IsEqualWithoutWhiteSpace(str1, str2, /*ignore case?*/ true); // return true.
我想写一个函数来判断两个字符串是否相等,忽略第一个字符串的空格前缀和后缀,而不调用string.Trim()。还请考虑不敏感的情况。
认为:
string str1 = " Abc ";
string str2 = "abc";
bool trueEqual = IsEqualWithoutWhiteSpace(str1, str2, /*ignore case?*/ true); // return true.
我假设您出于性能原因想要这样做(在某些情况下这将是一个正当的理由 - 我会为您省去通常的过早优化警告)。
首先,计算两个字符串开头和结尾的空白字符数。如果非空白部分的长度不同,则返回 false。现在我们知道它具有相同的长度。
接下来,stringA.IndexOf(stringB, ...)
使用适当的 start 和 count 参数调用以确定是否找到匹配项。如果匹配,则根据您的实现,字符串相等。
如果您不需要不区分大小写,您也可以使用循环来比较两个字符串的中间部分。
就像评论显示的那样,没有直接的理由不使用修剪。因此,如果您确信 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);
如果这是性能原因,请重新考虑您的问题,因为您问的是“有人可以为我写一个函数吗”而不是“有人可以解释为什么我的代码不起作用”。
再次踢罐头 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 组合数,一旦发现非空白字符,修剪就可以终止,因此从逻辑上讲,对于函数调用来说,这是一个更简单的问题。
看,不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()
在我自己的一个项目中使用这个。