删除string中的空格最快的方法
我试图从数据库表中的string中获取由“,”分隔的多个电子邮件地址,但它也返回给我的空格,我想快速删除空白。
下面的代码确实删除了空格,但是当我尝试在像30000这样的string中获取大量电子邮件地址时,它也变得很慢,然后尝试删除它们之间的空格。 需要四到五分钟时间去除这些空间。
Regex Spaces = new Regex(@"\s+", RegexOptions.Compiled); txtEmailID.Text = MultipleSpaces.Replace(emailaddress),"");
任何人都可以告诉我,即使大量的电子邮件地址,我怎样才能删除一秒钟内的空白?
我会使用StringBuilder
构build一个自定义的扩展方法,如:
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' }));
使用哈希集版本,一个11百万字符的string需要less于700毫秒(我在debugging模式)
编辑:
以前的代码是通用的,允许排除任何字符,但是如果您想以最快的方式删除空格,您可以使用:
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(); }
鉴于string.Replace
的实现是用C ++编写的,也是CLR运行时的一部分,我敢打赌
email.Replace(" ","").Replace("\t","").Replace("\n","").Replace("\r","");
将是最快的实施。 如果你需要每种types的空白 ,你可以提供hex值的Unicode等效。
你应该尝试String.Trim()
。 它将修剪从string的开始到结束的所有空格
或者你可以从链接主题尝试这个方法: [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)); }
用linq你可以简单地做到这一点:
emailaddress = new String(emailaddress .Where(x=>x!=' ' && x!='\r' && x!='\n') .ToArray());
我没有把它和stringbuilder方法做比较,但是比基于string的方法要快得多。 因为它不会创build很多string的副本(string是不可变的,直接使用它会导致显着的内存和速度问题),所以它不会使用非常大的内存,不会减慢速度(除了一个额外的通过string)。
emailaddress.Replace(" ", string.empty);
有很多不同的方法,有些比其他更快:
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+", "") }
请使用String
类的TrimEnd()
方法。 你可以在这里find一个很好的例子。
string str = "Hi!! this is a bunch of text with spaces"; MessageBox.Show(new String(str.Where(c => c != ' ').ToArray()));
您应该考虑在存储过程中更换logging集上的空格,或者在可能的情况下使用REPLACE( )
函数进行查询,甚至更好地修复数据库logging,因为电子邮件地址中的空间无效。
正如其他人所提到的那样,您需要分析不同的方法。 如果你正在使用正则expression式,你应该最低限度地使它成为一个类级别的静态variables:
public static Regex MultipleSpaces = new Regex(@"\s+", RegexOptions.Compiled);
emailAddress.Where(x=>{ return x != ' ';}).ToString( )
可能会有函数开销,尽pipe它可以被微软内联优化 – 再次分析会给你答案。
最有效的方法是分配一个缓冲区并逐个字符地复制到一个新的缓冲区,然后像这样跳过空格。 C#不支持指针,所以你可以使用不安全的代码,分配一个原始的缓冲区,并使用指针运算来复制,就像在C中一样,这是可以做到的。 SQL中的REPLACE( )
将像这样处理它。
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"; }
string s = " Your Text "; string new = s.Replace(" ", string.empty); // Output: // "YourText"
最快和一般的方法来做到这一点(行结束符,选项卡也将被处理)。 正则expression式function强大的设施并不需要解决这个问题,但正则expression式可以降低性能。
new string (stringToRemoveWhiteSpaces .Where ( c => !char.IsWhiteSpace(c) ) .ToArray<char>() )