删除字符串中空白区域的最快方法

时间:2011-03-05 11:46:48

标签: c# .net string whitespace

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

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

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

有人可以告诉我,即使是大量的电子邮件地址,如何在一秒内删除空格?

13 个答案:

答案 0 :(得分:44)

我会使用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版本,一个包含11百万个字符的字符串需要不到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.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();
}

答案 1 :(得分:14)

鉴于string.Replace的实现是用C ++编写的,而部分CLR runtime我愿意打赌

email.Replace(" ","").Replace("\t","").Replace("\n","").Replace("\r","");

将是最快的实施。如果需要every type of whitespace,则可以提供等效于unicode的十六进制值。

答案 2 :(得分:5)

使用linq你可以做到:

emailaddress = new String(emailaddress
                                     .Where(x=>x!=' ' && x!='\r' && x!='\n')
                                     .ToArray());

我没有将它与stringbuilder方法进行比较,但比基于字符串的方法快得多。 因为它不会创建许多字符串副本(字符串是不可变的并且直接使用它会导致显着的内存和速度问题),所以它不会使用非常大的内存而不会减慢速度(除了一个额外的通过首先是字符串)。

答案 3 :(得分:4)

您应该尝试String.Trim()。它将从字符串的开头到结尾修剪所有空格

或者您可以从链接主题[link]

尝试此方法
    public static unsafe string StripTabsAndNewlines(string s)
    {
        int len = s.Length;
        char* newChars = stackalloc char[len];
        char* currentChar = newChars;

        for (int i = 0; i < len; ++i)
        {
            char c = s[i];
            switch (c)
            {
                case '\r':
                case '\n':
                case '\t':
                    continue;
                default:
                    *currentChar++ = c;
                    break;
            }
        }
        return new string(newChars, 0, (int)(currentChar - newChars));
    }

答案 4 :(得分:4)

emailaddress.Replace("  ", string.empty);

答案 5 :(得分:2)

请使用TrimEnd()课程的String方法。你可以找到一个很好的例子here.

答案 6 :(得分:2)

有许多不同的方式,有人比其他方式更快:

public static string StripTabsAndNewlines(this string str) {

    //string builder (fast)
    StringBuilder sb = new StringBuilder(str.Length);
    for (int i = 0; i < str.Length; i++) {
        if ( !  Char.IsWhiteSpace(s[i])) {
            sb.Append();
        }
    }
    return sb.tostring();

    //linq (faster ?)
    return new string(str.ToCharArray().Where(c => !Char.IsWhiteSpace(c)).ToArray());

    //regex (slow)
    return Regex.Replace(str, @"\s+", "")

}

答案 7 :(得分:1)

如果可能,您应该考虑使用REPLACE( )功能替换存储过程或查询中记录集上的空格。更好地修复您的数据库记录,因为电子邮件地址中的空格无论如何都是无效的。

正如其他人所提到的,您需要分析不同的方法。如果您正在使用Regex,则应该最低限度地使其成为类级静态变量:

public static Regex MultipleSpaces = new Regex(@"\s+", RegexOptions.Compiled);

emailAddress.Where(x=>{ return x != ' ';}).ToString( )可能会有功能开销,虽然它可以通过微软内联进行优化 - 再次分析会给你答案。

最有效的方法是分配缓冲区并逐个字符地复制到新缓冲区并跳过空格。 C#确实支持指针,因此您可以使用不安全的代码,分配原始缓冲区并使用指针算法进行复制,就像在C中一样,并且可以尽可能快地完成。 SQL中的REPLACE( )会像你那样处理它。

答案 8 :(得分:1)

string str = "Hi!! this is a bunch of text with spaces";

MessageBox.Show(new String(str.Where(c => c != ' ').ToArray()));

答案 9 :(得分:1)

我尚未对此进行性能测试,但是它比其他大多数答案都简单。

var s1 = "\tstring \r with \t\t  \nwhitespace\r\n";
var s2 = string.Join("", s1.Split());

结果是

stringwithwhitespace

答案 10 :(得分:0)

string input =Yourinputstring;
string[] strings = input.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
foreach (string value in strings)
{
   string newv= value.Trim();
   if (newv.Length > 0)
   newline += value + "\r\n";
}

答案 11 :(得分:0)

string s = " Your Text ";

string new = s.Replace(" ", string.empty);

// Output:
// "YourText"

答案 12 :(得分:0)

执行此操作的最快速和最常用的方法(行终止符,标签也将被处理)。正则表达式强大的设施并不是解决这个问题的必要条件,但正则表达式会降低性能。

new string
    (stringToRemoveWhiteSpaces
       .Where
       (
         c => !char.IsWhiteSpace(c)
       )
       .ToArray<char>()
    )