我正在尝试从数据库表中的字符串中获取多个用“,”分隔的电子邮件地址,但它也返回了空白,我想快速删除空白。
以下代码确实删除了空格,但是每当我尝试以30000之类的字符串来获取大量电子邮件地址,然后尝试删除它们之间的空格时,它也会变慢。删除这些空间需要四到五分钟的时间。
Regex Spaces =
new Regex(@"\s+", RegexOptions.Compiled);
txtEmailID.Text = MultipleSpaces.Replace(emailaddress),"");
有人可以告诉我,即使对于大量电子邮件地址,我如何在一秒钟内删除空格?
最佳答案
我将使用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毫秒(而且我处于 Debug模式)
编辑:
先前的代码是通用的,并且允许排除任何字符,但是如果您想以最快的方式删除空格,则可以使用:
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.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();
}