Dave Bish的回答很好,并且工作正常。
值得注意的是,虽然更换Cast<Match>()
与OfType<Match>()
意志加快速度。
代码变成:
var arr = Regex.Matches(strText, @"\b[A-Za-z-']+\b")
.OfType<Match>()
.Select(m => m.Groups[0].Value)
.ToArray();
结果是完全相同的(并且以完全相同的方式解决了OP的问题),但是对于大型字符串来说,速度更快。
测试代码:
static void Test()
{
Stopwatch sw = new Stopwatch();
StringBuilder sb = new StringBuilder();
string strText = "this will become a very long string after my code has done appending it to the stringbuilder ";
Enumerable.Range(1, 100000).ToList().ForEach(i => sb.Append(strText));
strText = sb.ToString();
sw.Start();
var arr = Regex.Matches(strText, @"\b[A-Za-z-']+\b")
.OfType<Match>()
.Select(m => m.Groups[0].Value)
.ToArray();
sw.Stop();
Console.WriteLine("OfType: " + sw.ElapsedMilliseconds.ToString());
sw.Reset();
sw.Start();
var arr2 = Regex.Matches(strText, @"\b[A-Za-z-']+\b")
.Cast<Match>()
.Select(m => m.Groups[0].Value)
.ToArray();
sw.Stop();
Console.WriteLine("Cast: " + sw.ElapsedMilliseconds.ToString());
}
输出如下:
OfType: 6540
Cast: 8743
因此,对于非常长的字符串,Cast()速度较慢。
OfType<Match>()
本该使用它而不是Cast<Match>()
...然后,结果将是相同的。