2012-07-19 88 views
0

可能重复:
String.comparison performance (with trim)如何比较受忽视“”前缀和后缀字符串没有调用string.Trim()

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

假设:

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

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

“无呼叫string.Trim()”为什么组合LEN1数,其中为修剪可以终止,一旦它发现一个非空白字符,因此在逻辑上是对的函数调用来解决一个简单的问题。 ? – vcsjones 2012-07-19 14:27:17

+1

是有原因的'Trim'编写的。*这是它。* – 2012-07-19 14:28:28

+1

为什么你已经打上标签perfromance问题吗?它是重要的,你要使用这种方法对大型字符串? – sll 2012-07-19 14:29:02

回答

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); 

,如果它是一款性能原因,请重新考虑你的问题,因为你是问“有人可以编写一个函数对我”,而不是“人能解释为什么我的代码不工作”。

+1

这不回答这个问题。它是评论中提出的“过早优化”警告的延伸。你不添加任何东西给他们。 – usr 2012-07-19 14:33:59

+0

@usr对不起,我打算回答最初的问题“如何来比较忽略字符串‘’前缀和后缀,而不调用string.Trim()”而采取的意见考虑在内,认为目前没有理由不使用修剪,不来自OP的进一步信息。 – dowhilefor 2012-07-19 14:37:15

1

我假设你想要这样做是出于性能方面的原因(在某些情况下这将是一个有效的原因 - 我会为你提供一些过早的优化警告)。

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

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

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

+0

是的,我关心性能,因为每次调用string.Trim()都会创建一个新的字符串。不知道我是否有权将它称为处理巨大的字符串。 – Anders06 2012-07-19 23:05:28

0

look ma,no 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()这在我自己的项目之一。

+1

没有修剪,它的唯一的幅度(约)慢(并且不与大多数空白字符的工作,如回车,换行等等......还有就是为什么'\ s'被发明了正则表达式的一个原因)。 .. ^^ – Nuffin 2012-07-19 14:43:28

+0

在我的粗略测试中,使用正则表达式需要大约20倍的时间。就像我说的,我只是使用'Trim()'。 – paul 2012-07-19 14:44:13

+0

保罗,谢谢你的帮助。正如你所说,正则表达式的表现不够好:) – Anders06 2012-07-19 23:10:50

0

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

bool found = string1.Contains(string2);

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

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

最后,如果您不确定哪一个具有空白区域,但只有其中一个会(例如,两个输入中的一个来自合理可靠的来源(如代码中的字符串),另一个来自某个用户添加,但您不确定您的代码的用户可能选择将输入放入哪个订单),您可以使用或操作符:

bool found = string1.Contains(string2)||字符串2。含有(字符串1);

虽然和.Net团队做了很好的工作,使得他们的代码高效,所以它可能调用trim和比较一次比比较两次并避免Trim调用更有效(比较必须看在至少LEN2 -