Joe*_*Joe 24 .net c# string whitespace
我正在尝试从数据库表中的字符串中获取由","分隔的多个电子邮件地址,但它也返回了我的空格,我想快速删除空白.
下面的代码并删除空白,但每当我尝试像30000的字符串来获取大量的电子邮件地址,它也变得缓慢,然后尝试消除它们之间的空白.删除这些空间需要四到五分钟.
Regex Spaces =
new Regex(@"\s+", RegexOptions.Compiled);
txtEmailID.Text = MultipleSpaces.Replace(emailaddress),"");
Run Code Online (Sandbox Code Playgroud)
任何人都可以告诉我,即使是大量的电子邮件地址,如何在一秒内删除空格?
dig*_*All 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();
}
Run Code Online (Sandbox Code Playgroud)
用法:
var str = s.ExceptChars(new[] { ' ', '\t', '\n', '\r' });
Run Code Online (Sandbox Code Playgroud)
或者更快:
var str = s.ExceptChars(new HashSet<char>(new[] { ' ', '\t', '\n', '\r' }));
Run Code Online (Sandbox Code Playgroud)
使用hashset版本,一个包含11百万个字符的字符串不到700毫秒(我正处于调试模式)
编辑:
以前的代码是通用的,允许排除任何char,但如果你想以最快的方式删除空白,你可以使用:
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();
}
Run Code Online (Sandbox Code Playgroud)
编辑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();
}
Run Code Online (Sandbox Code Playgroud)
使用linq你可以简单地做到:
emailaddress = new String(emailaddress
.Where(x=>x!=' ' && x!='\r' && x!='\n')
.ToArray());
Run Code Online (Sandbox Code Playgroud)
我没有将它与stringbuilder方法进行比较,但比基于字符串的方法快得多.因为它不会创建许多字符串副本(字符串是不可变的并且直接使用它会导致显着的内存和速度问题),所以它不会使用非常大的内存而不会减慢速度(除了一个额外的通过首先是字符串).