我会使用
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' }));
使用哈希集版本,一个包含1100万个字符的字符串只需要不到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();
}