我使用这个方法来清理字符串。
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中
任何建议都将不胜感激。
发布于 2012-07-09 21:29:47
如果你追求的是纯粹的速度和效率,我建议你这样做:
public static string CleanString(string dirtyString)
{
HashSet<char> removeChars = new HashSet<char>(" ?&^$#@!()+-,:;<>’\'-_*");
StringBuilder result = new StringBuilder(dirtyString.Length);
foreach (char c in dirtyString)
if (!removeChars.Contains(c)) // prevent dirty chars
result.Append(c);
return result.ToString();
}
RegEx当然是一个优雅的解决方案,但它增加了额外的开销。通过指定字符串构建器的起始长度,它只需要分配一次内存(并为末尾的ToString
分配第二次内存)。这将减少内存使用并提高速度,特别是在较长的字符串上。
然而,正如L.B.所说,如果您正在使用它来正确地编码绑定到HTML输出的文本,那么您应该使用HttpUtility.HtmlEncode
而不是自己来做它。
发布于 2012-07-09 21:16:18
使用正则表达式[?&^$#@!()+-,:;<>’\'-_*]
替换为空字符串
发布于 2012-07-09 21:30:02
我不知道在性能方面,使用Regex
或LINQ是否会有所改善。
可能有用的是,使用StringBuilder
而不是每次都使用string.Replace
来创建新字符串:
using System.Linq;
using System.Text;
static class Program {
static void Main(string[] args) {
const string removeChars = " ?&^$#@!()+-,:;<>’\'-_*";
string result = "x&y(z)";
// specify capacity of StringBuilder to avoid resizing
StringBuilder sb = new StringBuilder(result.Length);
foreach (char x in result.Where(c => !removeChars.Contains(c))) {
sb.Append(x);
}
result = sb.ToString();
}
}
https://stackoverflow.com/questions/11395775
复制相似问题