一尘不染

删除字符串中空格的最快方法

c#

我试图从数据库表的字符串中获取多个以“,”分隔的电子邮件地址,但是它也向我返回空格,并且我想快速删除空格。

以下代码确实删除了空格,但是每当我尝试以30000之类的字符串来获取大量电子邮件地址,然后尝试删除它们之间的空格时,它也会变慢。删除这些空间需要四到五分钟的时间。

 Regex Spaces =
        new Regex(@"\s+", RegexOptions.Compiled);
txtEmailID.Text = MultipleSpaces.Replace(emailaddress),"");

谁能告诉我,即使对于大量电子邮件地址,我如何在一秒钟内删除空格?


阅读 297

收藏
2020-05-19

共1个答案

一尘不染

我将使用构建自定义扩展方法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:

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();
}
2020-05-19