var result = str.Where(c => char.IsLetter(c));
Run Code Online (Sandbox Code Playgroud)
我对@ KirillPolishchuk的回答非常感兴趣,所以我刚用LINQPad做了一个小基准,使用随机构建的字符串,这里是完整的代码(虽然它返回了一个IEnumerable,我不得不略微更改我的原始代码):
void Main()
{
TimeSpan elapsed;
string result;
elapsed = TheLINQWay(buildString(1000000), out result);
Console.WriteLine("LINQ way: {0}", elapsed);
elapsed = TheRegExWay(buildString(1000000), out result);
Console.WriteLine("RegEx way: {0}", elapsed);
}
TimeSpan TheRegExWay(string s, out string result)
{
Stopwatch stopw = new Stopwatch();
stopw.Start();
result = Regex.Replace(s, @"\P{L}", string.Empty);
stopw.Stop();
return stopw.Elapsed;
}
TimeSpan TheLINQWay(string s, out string result)
{
Stopwatch stopw = new Stopwatch();
stopw.Start();
result = new string(s.Where(c => char.IsLetter(c)).ToArray());
stopw.Stop();
return stopw.Elapsed;
}
string buildString(int len)
{
byte[] buffer = new byte[len];
Random r = new Random((int)DateTime.Now.Ticks);
for(int i = 0; i < len; i++)
buffer[i] = (byte)r.Next(256);
return Encoding.ASCII.GetString(buffer);
}
Run Code Online (Sandbox Code Playgroud)
这是结果:
LINQ way: 00:00:00.0150030
RegEx way: 00:00:00.2788130
Run Code Online (Sandbox Code Playgroud)
但仍然需要说一句话:正如Servy在他的评论中指出的那样,正则表达式更短,字符串更短.
使用:
var result = Regex.Replace(input, @"\P{L}", string.Empty);
Run Code Online (Sandbox Code Playgroud)