我用这个方法清理一个字符串:
public static string CleanString(string dirtyString)
{
string removeChars = " ?&^$#@!()+-,:;<>’\'-_*";
string result = dirtyString;
foreach (char c in removeChars)
{
result = result.Replace(c.ToString(), string.Empty);
}
return result;
}
这个方法给出了正确的结果。但是,这个方法有一个性能问题。每次传递字符串时,每个字符都会进入循环。如果字符串很大,那么返回对象将花费太多时间。
有没有更好的方法来做同样的事情?也许使用LINQ或jQuery/JavaScript?
如有任何建议,我们将不胜感激。
9条答案
按热度按时间lx0bsm1f1#
好的,考虑下面的测试:
输出
结论
使用哪种方法可能并不重要。
最快的时间差(
UseWhere
:233毫秒)和最慢的(UseStringBuilder
:2805ms)方法的时间为2572ms。如果您不经常执行这个方法,这个差异并不重要。但是,如果性能很重要,则使用
UseWhere
方法(由L.B编写)。k5hmc34c2#
如果你追求的只是速度和效率,我建议你这样做:
RegEx当然是一个很好的解决方案,但是它增加了额外的开销。通过指定字符串构建器的起始长度,它只需要分配一次内存(在结束时为
ToString
分配第二次)。这将减少内存使用并提高速度,特别是对于较长的字符串。但是,正如L.B.所说,如果您要使用此方法对绑定到HTML输出的文本进行正确编码,则应该使用
HttpUtility.HtmlEncode
,而不是自己进行编码。vkc1a9a23#
使用正则表达式
[?&^$#@!()+-,:;<>’\'-_*]
替换为空字符串50pmv0ei4#
我不知道在性能方面,使用
Regex
或LINQ是否会有所改进。使用
StringBuilder
创建新字符串,而不是每次都使用string.Replace
,这可能会很有用:72qzrwbm5#
这个更快!
用途:
omhiaaxx6#
给予看:http://msdn.microsoft.com/en-us/library/xwewhkd1.aspx
pkln4tw67#
首先解释“为什么”,然后解释“是什么”可能会有所帮助。性能变慢的原因是因为c#复制并替换每个替换的字符串。根据我的经验,在.NET中使用Regex并不总是更好--尽管在大多数情况下(我认为包括这一个)它可能会工作得很好。
如果我真的需要性能,我通常不会让它取决于运气,而只是告诉编译器我到底想要什么:也就是说:创建一个字符数上限的字符串,然后复制其中所有需要的字符。也可以用switch / case或array来替换hashset,在这种情况下,您可能会以跳转表或数组查找结束--这会更快。
“务实”的最佳但快速的解决方案是:
顺便说一句:当你想处理高代理Unicode字符时,这个解决方案是不正确的--但是可以很容易地修改以包括这些字符。
wd2eg0qa8#
我在我目前的项目中使用了这个,它工作得很好。它取一个句子,删除所有非字母数字字符,然后返回句子,所有单词的第一个字母都是大写,其他所有单词都是小写。也许我应该叫它SentenceNormalizer。命名很难:)
hlswsv359#
我不能花时间对酸测试这一点,但这一行实际上并没有清理斜线所需的。
我必须单独添加斜杠并转义反斜杠