我正在尝试从数据库表中的字符串中获取多个用“,”分隔的电子邮件地址,但它也返回了空白,我想快速删除空白。

以下代码确实删除了空格,但是每当我尝试以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();
}

10-07 19:39
查看更多