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

标签 c# .net string whitespace

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

下面的代码确实删除了空格,但每当我尝试获取像 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' }));

使用 hashset 版本,一个 1100 万个字符的字符串花费不到 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();
}

关于c# - 删除字符串中空格的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5203607/

相关文章:

c# - 从文本文件读取会创建三个点

.NET 兼容的二维码扫描设备

c - 尝试使用 fgetc() 从文件中读取未知字符串长度

javascript - 在整个字符串中随机分隔字符?

c# - "is a field and used like a type"错误

c# - 发送异步电子邮件

c# - 如何在输入时读取 C# 控制台应用程序的整个命令行?

c# - 无法在 Asp.net Web 窗体应用程序中填充网格 onclick 事件

c# - 播放时加载纹理

c++ - 我如何接受字符串或 double 值作为输入? C++