我试图从数据库表的字符串中获取多个以“,”分隔的电子邮件地址,但是它也向我返回空格,并且我想快速删除空格。
以下代码确实删除了空格,但是每当我尝试以30000之类的字符串来获取大量电子邮件地址,然后尝试删除它们之间的空格时,它也会变慢。删除这些空间需要四到五分钟的时间。
Regex Spaces = new Regex(@"\s+", RegexOptions.Compiled); txtEmailID.Text = MultipleSpaces.Replace(emailaddress),"");
谁能告诉我,即使对于大量电子邮件地址,我如何在一秒钟内删除空格?
我将使用构建自定义扩展方法StringBuilder,例如:
StringBuilder
public static string ExceptChars(this string str, IEnumerable<char> toExclude) { StringBuilder sb = new StringBuilder(str.Length); for (int i = 0; i < str.Length; i++) { char c = str[i]; if (!toExclude.Contains(c)) sb.Append(c); } return sb.ToString(); }
用法:
var str = s.ExceptChars(new[] { ' ', '\t', '\n', '\r' });
甚至更快:
var str = s.ExceptChars(new HashSet<char>(new[] { ' ', '\t', '\n', '\r' }));
使用哈希集版本时,一千一百万个字符的字符串耗时不到700毫秒(并且我处于调试模式)
编辑:
先前的代码是通用的,并且允许排除任何字符,但是如果您想以最快的方式删除空格,则可以使用:
public static string ExceptBlanks(this string str) { StringBuilder sb = new StringBuilder(str.Length); for (int i = 0; i < str.Length; i++) { char c = str[i]; switch (c) { case '\r': case '\n': case '\t': case ' ': continue; default: sb.Append(c); break; } } return sb.ToString(); }
编辑2:
正如评论中正确指出的那样,删除 所有 空白的正确方法是使用char.IsWhiteSpacemethod:
char.IsWhiteSpace
public static string ExceptBlanks(this string str) { StringBuilder sb = new StringBuilder(str.Length); for (int i = 0; i < str.Length; i++) { char c = str[i]; if(!char.IsWhiteSpace(c)) sb.Append(c); } return sb.ToString(); }